* introduce py.io.TextIO and py.io.StringIO to help with 3k transition and to clarify
intentions when doing "in-memory" files. Replace most usages of StringIO. * consolidate py.io's files and tests into fewer files, make files 3k-importable --HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									046ac957ab
								
							
						
					
					
						commit
						1fcd373bd5
					
				|  | @ -1,6 +1,10 @@ | |||
| Changes between 1.0.x and 'trunk' | ||||
| ===================================== | ||||
| 
 | ||||
| * introduce py.io.TextIO and py.io.BytesIO for distinguishing between | ||||
|   text/unicode and byte-streams (uses underlying standard lib io.*  | ||||
|   if available)  | ||||
|   | ||||
| * simplified internal localpath implementation  | ||||
| 
 | ||||
| Changes between 1.0.0 and 1.0.1 | ||||
|  |  | |||
|  | @ -154,10 +154,12 @@ initpkg(__name__, | |||
| 
 | ||||
|     # input-output helping  | ||||
|     'io.__doc__'             : ('./io/__init__.py', '__doc__'), | ||||
|     'io.dupfile'             : ('./io/dupfile.py', 'dupfile'),  | ||||
|     'io.FDCapture'           : ('./io/fdcapture.py', 'FDCapture'),  | ||||
|     'io.StdCapture'          : ('./io/stdcapture.py', 'StdCapture'),  | ||||
|     'io.StdCaptureFD'        : ('./io/stdcapture.py', 'StdCaptureFD'),  | ||||
|     'io.dupfile'             : ('./io/capture.py', 'dupfile'),  | ||||
|     'io.TextIO'              : ('./io/capture.py', 'TextIO'),  | ||||
|     'io.BytesIO'             : ('./io/capture.py', 'BytesIO'),  | ||||
|     'io.FDCapture'           : ('./io/capture.py', 'FDCapture'),  | ||||
|     'io.StdCapture'          : ('./io/capture.py', 'StdCapture'),  | ||||
|     'io.StdCaptureFD'        : ('./io/capture.py', 'StdCaptureFD'),  | ||||
|     'io.TerminalWriter'      : ('./io/terminalwriter.py', 'TerminalWriter'),  | ||||
| 
 | ||||
|     # error module, defining all errno's as Classes | ||||
|  |  | |||
|  | @ -4,7 +4,6 @@ import py | |||
| from py.__.execnet import gateway | ||||
| mypath = py.magic.autopath() | ||||
| 
 | ||||
| from StringIO import StringIO | ||||
| from py.__.execnet.register import startup_modules, getsource  | ||||
| 
 | ||||
| TESTTIMEOUT = 10.0 # seconds | ||||
|  | @ -43,9 +42,9 @@ def test_stdouterrin_setnull(): | |||
| class TestMessage: | ||||
|     def test_wire_protocol(self): | ||||
|         for cls in gateway.Message._types.values(): | ||||
|             one = StringIO() | ||||
|             one = py.io.TextIO() | ||||
|             cls(42, '23').writeto(one) | ||||
|             two = StringIO(one.getvalue()) | ||||
|             two = py.io.TextIO(one.getvalue()) | ||||
|             msg = gateway.Message.readfrom(two) | ||||
|             assert isinstance(msg, cls) | ||||
|             assert msg.channelid == 42 | ||||
|  | @ -317,7 +316,7 @@ class BasicRemoteExecution: | |||
|         assert str(err).find("ValueError") != -1 | ||||
| 
 | ||||
|     def test_remote_redirect_stdout(self):  | ||||
|         out = py.std.StringIO.StringIO()  | ||||
|         out = py.io.TextIO()  | ||||
|         handle = self.gw._remote_redirect(stdout=out)  | ||||
|         c = self.gw.remote_exec("print 42") | ||||
|         c.waitclose(TESTTIMEOUT) | ||||
|  |  | |||
|  | @ -1,8 +1,8 @@ | |||
| from StringIO import StringIO | ||||
| import py | ||||
| 
 | ||||
| def pickletest(mod): | ||||
|     f1 = StringIO() | ||||
|     f2 = StringIO() | ||||
|     f1 = py.io.TextIO() | ||||
|     f2 = py.io.TextIO() | ||||
| 
 | ||||
|     pickler1 = mod.Pickler(f1) | ||||
|     unpickler1 = mod.Unpickler(f2) | ||||
|  |  | |||
|  | @ -1,8 +1,100 @@ | |||
| import os | ||||
| import sys | ||||
| import py | ||||
| try: from cStringIO import StringIO | ||||
| except ImportError: from StringIO import StringIO | ||||
| import tempfile | ||||
| 
 | ||||
| try:  | ||||
|     from io import StringIO | ||||
| except ImportError:  | ||||
|     from StringIO import StringIO | ||||
| 
 | ||||
| class TextIO(StringIO): | ||||
|     def write(self, data): | ||||
|         if not isinstance(data, unicode): | ||||
|             data = unicode(data, getattr(self, '_encoding', 'UTF-8')) | ||||
|         StringIO.write(self, data) | ||||
| 
 | ||||
| try: | ||||
|     from io import BytesIO | ||||
| except ImportError: | ||||
|     class BytesIO(StringIO): | ||||
|         def write(self, data): | ||||
|             if isinstance(data, unicode): | ||||
|                 raise TypeError("not a byte value: %r" %(data,)) | ||||
|             StringIO.write(self, data) | ||||
| 
 | ||||
| class FDCapture:  | ||||
|     """ Capture IO to/from a given os-level filedescriptor. """ | ||||
|      | ||||
|     def __init__(self, targetfd, tmpfile=None):  | ||||
|         self.targetfd = targetfd | ||||
|         if tmpfile is None:  | ||||
|             tmpfile = self.maketmpfile() | ||||
|         self.tmpfile = tmpfile  | ||||
|         self._savefd = os.dup(targetfd) | ||||
|         os.dup2(self.tmpfile.fileno(), targetfd)  | ||||
|         self._patched = [] | ||||
| 
 | ||||
|     def setasfile(self, name, module=sys):  | ||||
|         """ patch <module>.<name> to self.tmpfile | ||||
|         """ | ||||
|         key = (module, name) | ||||
|         self._patched.append((key, getattr(module, name))) | ||||
|         setattr(module, name, self.tmpfile)  | ||||
| 
 | ||||
|     def unsetfiles(self):  | ||||
|         """ unpatch all patched items | ||||
|         """ | ||||
|         while self._patched:  | ||||
|             (module, name), value = self._patched.pop() | ||||
|             setattr(module, name, value)  | ||||
| 
 | ||||
|     def done(self):  | ||||
|         """ unpatch and clean up, returns the self.tmpfile (file object) | ||||
|         """ | ||||
|         os.dup2(self._savefd, self.targetfd)  | ||||
|         self.unsetfiles()  | ||||
|         os.close(self._savefd)  | ||||
|         self.tmpfile.seek(0) | ||||
|         return self.tmpfile  | ||||
| 
 | ||||
|     def maketmpfile(self):  | ||||
|         """ create a temporary file | ||||
|         """ | ||||
|         f = tempfile.TemporaryFile() | ||||
|         newf = dupfile(f)  | ||||
|         f.close() | ||||
|         return newf  | ||||
| 
 | ||||
|     def writeorg(self, str): | ||||
|         """ write a string to the original file descriptor | ||||
|         """ | ||||
|         tempfp = tempfile.TemporaryFile() | ||||
|         try: | ||||
|             os.dup2(self._savefd, tempfp.fileno()) | ||||
|             tempfp.write(str) | ||||
|         finally: | ||||
|             tempfp.close() | ||||
| 
 | ||||
| 
 | ||||
| def dupfile(f, mode=None, buffering=0, raising=False):  | ||||
|     """ return a new open file object that's a duplicate of f | ||||
| 
 | ||||
|         mode is duplicated if not given, 'buffering' controls  | ||||
|         buffer size (defaulting to no buffering) and 'raising' | ||||
|         defines whether an exception is raised when an incompatible | ||||
|         file object is passed in (if raising is False, the file | ||||
|         object itself will be returned) | ||||
|     """ | ||||
|     try:  | ||||
|         fd = f.fileno()  | ||||
|     except AttributeError:  | ||||
|         if raising:  | ||||
|             raise  | ||||
|         return f | ||||
|     newfd = os.dup(fd)  | ||||
|     mode = mode and mode or f.mode | ||||
|     return os.fdopen(newfd, mode, buffering)  | ||||
| 
 | ||||
| 
 | ||||
| class Capture(object): | ||||
|  | @ -141,14 +233,14 @@ class StdCapture(Capture): | |||
|         if out:  | ||||
|             self._oldout = sys.stdout | ||||
|             if not hasattr(out, 'write'): | ||||
|                 out = StringIO() | ||||
|                 out = TextIO() | ||||
|             sys.stdout = self.out = out | ||||
|         if err:  | ||||
|             self._olderr = sys.stderr | ||||
|             if out and mixed:  | ||||
|                 err = self.out  | ||||
|             elif not hasattr(err, 'write'): | ||||
|                 err = StringIO() | ||||
|                 err = TextIO() | ||||
|             sys.stderr = self.err = err | ||||
|         if in_: | ||||
|             self._oldin  = sys.stdin | ||||
|  | @ -1,22 +0,0 @@ | |||
| 
 | ||||
| import os | ||||
| 
 | ||||
| def dupfile(f, mode=None, buffering=0, raising=False):  | ||||
|     """ return a new open file object that's a duplicate of f | ||||
| 
 | ||||
|         mode is duplicated if not given, 'buffering' controls  | ||||
|         buffer size (defaulting to no buffering) and 'raising' | ||||
|         defines whether an exception is raised when an incompatible | ||||
|         file object is passed in (if raising is False, the file | ||||
|         object itself will be returned) | ||||
|     """ | ||||
|     try:  | ||||
|         fd = f.fileno()  | ||||
|     except AttributeError:  | ||||
|         if raising:  | ||||
|             raise  | ||||
|         return f | ||||
|     newfd = os.dup(fd)  | ||||
|     mode = mode and mode or f.mode | ||||
|     return os.fdopen(newfd, mode, buffering)  | ||||
| 
 | ||||
|  | @ -1,59 +0,0 @@ | |||
| 
 | ||||
| import os | ||||
| import sys | ||||
| import py | ||||
| import tempfile | ||||
| 
 | ||||
| class FDCapture:  | ||||
|     """ Capture IO to/from a given os-level filedescriptor. """ | ||||
|      | ||||
|     def __init__(self, targetfd, tmpfile=None):  | ||||
|         self.targetfd = targetfd | ||||
|         if tmpfile is None:  | ||||
|             tmpfile = self.maketmpfile() | ||||
|         self.tmpfile = tmpfile  | ||||
|         self._savefd = os.dup(targetfd) | ||||
|         os.dup2(self.tmpfile.fileno(), targetfd)  | ||||
|         self._patched = [] | ||||
| 
 | ||||
|     def setasfile(self, name, module=sys):  | ||||
|         """ patch <module>.<name> to self.tmpfile | ||||
|         """ | ||||
|         key = (module, name) | ||||
|         self._patched.append((key, getattr(module, name))) | ||||
|         setattr(module, name, self.tmpfile)  | ||||
| 
 | ||||
|     def unsetfiles(self):  | ||||
|         """ unpatch all patched items | ||||
|         """ | ||||
|         while self._patched:  | ||||
|             (module, name), value = self._patched.pop() | ||||
|             setattr(module, name, value)  | ||||
| 
 | ||||
|     def done(self):  | ||||
|         """ unpatch and clean up, returns the self.tmpfile (file object) | ||||
|         """ | ||||
|         os.dup2(self._savefd, self.targetfd)  | ||||
|         self.unsetfiles()  | ||||
|         os.close(self._savefd)  | ||||
|         self.tmpfile.seek(0) | ||||
|         return self.tmpfile  | ||||
| 
 | ||||
|     def maketmpfile(self):  | ||||
|         """ create a temporary file | ||||
|         """ | ||||
|         f = tempfile.TemporaryFile() | ||||
|         newf = py.io.dupfile(f)  | ||||
|         f.close() | ||||
|         return newf  | ||||
| 
 | ||||
|     def writeorg(self, str): | ||||
|         """ write a string to the original file descriptor | ||||
|         """ | ||||
|         tempfp = tempfile.TemporaryFile() | ||||
|         try: | ||||
|             os.dup2(self._savefd, tempfp.fileno()) | ||||
|             tempfp.write(str) | ||||
|         finally: | ||||
|             tempfp.close() | ||||
| 
 | ||||
|  | @ -70,7 +70,7 @@ if sys.platform == 'win32': | |||
| def get_terminal_width(): | ||||
|     try: | ||||
|         height, width = _getdimensions() | ||||
|     except (SystemExit, KeyboardInterrupt), e: | ||||
|     except (SystemExit, KeyboardInterrupt): | ||||
|         raise | ||||
|     except: | ||||
|         # FALLBACK | ||||
|  | @ -144,7 +144,7 @@ class TerminalWriter(object): | |||
|     def __init__(self, file=None, stringio=False): | ||||
|         if file is None: | ||||
|             if stringio: | ||||
|                 self.stringio = file = py.std.cStringIO.StringIO() | ||||
|                 self.stringio = file = py.io.TextIO() | ||||
|             else: | ||||
|                 file = py.std.sys.stdout  | ||||
|         elif callable(file): | ||||
|  |  | |||
|  | @ -1,8 +1,31 @@ | |||
| import os, sys | ||||
| import py | ||||
| 
 | ||||
| class TestTextIO: | ||||
|     def test_text(self): | ||||
|         f = py.io.TextIO() | ||||
|         f.write("hello")  | ||||
|         s = f.getvalue() | ||||
|         assert s == "hello" | ||||
|         f.close() | ||||
| 
 | ||||
|     def test_unicode_and_str_mixture(self): | ||||
|         f = py.io.TextIO() | ||||
|         f.write(u"\u00f6") | ||||
|         f.write(str("hello"))  | ||||
|         s = f.getvalue() | ||||
|         f.close() | ||||
|         assert isinstance(s, unicode)  | ||||
| 
 | ||||
| def test_bytes_io(): | ||||
|     f = py.io.BytesIO() | ||||
|     f.write("hello")  | ||||
|     py.test.raises(TypeError, "f.write(u'hello')") | ||||
|     s = f.getvalue() | ||||
|     assert s == "hello" | ||||
| 
 | ||||
| def test_dontreadfrominput(): | ||||
|     from py.__.io.stdcapture import  DontReadFromInput | ||||
|     from py.__.io.capture import  DontReadFromInput | ||||
|     f = DontReadFromInput() | ||||
|     assert not f.isatty()  | ||||
|     py.test.raises(IOError, f.read) | ||||
|  | @ -10,6 +33,81 @@ def test_dontreadfrominput(): | |||
|     py.test.raises(IOError, iter, f)  | ||||
|     py.test.raises(ValueError, f.fileno) | ||||
| 
 | ||||
| def test_dupfile():  | ||||
|     somefile = py.std.os.tmpfile()  | ||||
|     flist = [] | ||||
|     for i in range(5):  | ||||
|         nf = py.io.dupfile(somefile) | ||||
|         assert nf != somefile | ||||
|         assert nf.fileno() != somefile.fileno() | ||||
|         assert nf not in flist  | ||||
|         print >>nf, i, | ||||
|         flist.append(nf)  | ||||
|     for i in range(5):  | ||||
|         f = flist[i] | ||||
|         f.close() | ||||
|     somefile.seek(0) | ||||
|     s = somefile.read() | ||||
|     assert s.startswith("01234") | ||||
|     somefile.close() | ||||
| 
 | ||||
| class TestFDCapture:  | ||||
|     def test_basic(self):  | ||||
|         tmpfile = py.std.os.tmpfile()  | ||||
|         fd = tmpfile.fileno() | ||||
|         cap = py.io.FDCapture(fd) | ||||
|         os.write(fd, "hello") | ||||
|         f = cap.done() | ||||
|         s = f.read() | ||||
|         assert s == "hello" | ||||
| 
 | ||||
|     def test_stderr(self):  | ||||
|         cap = py.io.FDCapture(2) | ||||
|         cap.setasfile('stderr') | ||||
|         print >>sys.stderr, "hello" | ||||
|         f = cap.done() | ||||
|         s = f.read() | ||||
|         assert s == "hello\n" | ||||
| 
 | ||||
|     def test_stdin(self):  | ||||
|         f = os.tmpfile() | ||||
|         print >>f, "3" | ||||
|         f.seek(0) | ||||
|         cap = py.io.FDCapture(0, tmpfile=f) | ||||
|         # check with os.read() directly instead of raw_input(), because | ||||
|         # sys.stdin itself may be redirected (as py.test now does by default) | ||||
|         x = os.read(0, 100).strip() | ||||
|         f = cap.done() | ||||
|         assert x == "3" | ||||
| 
 | ||||
|     def test_writeorg(self): | ||||
|         tmppath = py.test.ensuretemp('test_writeorg').ensure('stderr', | ||||
|                                                              file=True) | ||||
|         tmpfp = tmppath.open('w+b') | ||||
|         try: | ||||
|             cap = py.io.FDCapture(tmpfp.fileno()) | ||||
|             print >>tmpfp, 'foo' | ||||
|             cap.writeorg('bar\n') | ||||
|         finally: | ||||
|             tmpfp.close() | ||||
|         f = cap.done() | ||||
|         scap = f.read() | ||||
|         assert scap == 'foo\n' | ||||
|         stmp = tmppath.read() | ||||
|         assert stmp == "bar\n" | ||||
| 
 | ||||
|     def test_writeorg_wrongtype(self): | ||||
|         tmppath = py.test.ensuretemp('test_writeorg').ensure('stdout', | ||||
|                                                              file=True) | ||||
|         tmpfp = tmppath.open('r') | ||||
|         try: | ||||
|             cap = py.io.FDCapture(tmpfp.fileno()) | ||||
|             py.test.raises(IOError, "cap.writeorg('bar\\n')") | ||||
|         finally: | ||||
|             tmpfp.close() | ||||
|         f = cap.done() | ||||
| 
 | ||||
| 
 | ||||
| class TestStdCapture:  | ||||
|     def getcapture(self, **kw): | ||||
|         return py.io.StdCapture(**kw) | ||||
|  | @ -64,8 +162,8 @@ class TestStdCapture: | |||
|         cap = self.getcapture() | ||||
|         print "hello", | ||||
|         print >>sys.stderr, "world", | ||||
|         sys.stdout = py.std.StringIO.StringIO()  | ||||
|         sys.stderr = py.std.StringIO.StringIO()  | ||||
|         sys.stdout = py.io.TextIO()  | ||||
|         sys.stderr = py.io.TextIO()  | ||||
|         print "not seen"  | ||||
|         print >>sys.stderr, "not seen" | ||||
|         out, err = cap.reset() | ||||
|  | @ -1,20 +0,0 @@ | |||
| 
 | ||||
| import py | ||||
| 
 | ||||
| def test_dupfile():  | ||||
|     somefile = py.std.os.tmpfile()  | ||||
|     flist = [] | ||||
|     for i in range(5):  | ||||
|         nf = py.io.dupfile(somefile) | ||||
|         assert nf != somefile | ||||
|         assert nf.fileno() != somefile.fileno() | ||||
|         assert nf not in flist  | ||||
|         print >>nf, i, | ||||
|         flist.append(nf)  | ||||
|     for i in range(5):  | ||||
|         f = flist[i] | ||||
|         f.close() | ||||
|     somefile.seek(0) | ||||
|     s = somefile.read() | ||||
|     assert s.startswith("01234") | ||||
|     somefile.close() | ||||
|  | @ -1,59 +0,0 @@ | |||
| import os, sys | ||||
| import py | ||||
| 
 | ||||
| class TestFDCapture:  | ||||
|     def test_basic(self):  | ||||
|         tmpfile = py.std.os.tmpfile()  | ||||
|         fd = tmpfile.fileno() | ||||
|         cap = py.io.FDCapture(fd) | ||||
|         os.write(fd, "hello") | ||||
|         f = cap.done() | ||||
|         s = f.read() | ||||
|         assert s == "hello" | ||||
| 
 | ||||
|     def test_stderr(self):  | ||||
|         cap = py.io.FDCapture(2) | ||||
|         cap.setasfile('stderr') | ||||
|         print >>sys.stderr, "hello" | ||||
|         f = cap.done() | ||||
|         s = f.read() | ||||
|         assert s == "hello\n" | ||||
| 
 | ||||
|     def test_stdin(self):  | ||||
|         f = os.tmpfile() | ||||
|         print >>f, "3" | ||||
|         f.seek(0) | ||||
|         cap = py.io.FDCapture(0, tmpfile=f) | ||||
|         # check with os.read() directly instead of raw_input(), because | ||||
|         # sys.stdin itself may be redirected (as py.test now does by default) | ||||
|         x = os.read(0, 100).strip() | ||||
|         f = cap.done() | ||||
|         assert x == "3" | ||||
| 
 | ||||
|     def test_writeorg(self): | ||||
|         tmppath = py.test.ensuretemp('test_writeorg').ensure('stderr', | ||||
|                                                              file=True) | ||||
|         tmpfp = tmppath.open('w+b') | ||||
|         try: | ||||
|             cap = py.io.FDCapture(tmpfp.fileno()) | ||||
|             print >>tmpfp, 'foo' | ||||
|             cap.writeorg('bar\n') | ||||
|         finally: | ||||
|             tmpfp.close() | ||||
|         f = cap.done() | ||||
|         scap = f.read() | ||||
|         assert scap == 'foo\n' | ||||
|         stmp = tmppath.read() | ||||
|         assert stmp == "bar\n" | ||||
| 
 | ||||
|     def test_writeorg_wrongtype(self): | ||||
|         tmppath = py.test.ensuretemp('test_writeorg').ensure('stdout', | ||||
|                                                              file=True) | ||||
|         tmpfp = tmppath.open('r') | ||||
|         try: | ||||
|             cap = py.io.FDCapture(tmpfp.fileno()) | ||||
|             py.test.raises(IOError, "cap.writeorg('bar\\n')") | ||||
|         finally: | ||||
|             tmpfp.close() | ||||
|         f = cap.done() | ||||
| 
 | ||||
|  | @ -1,7 +1,6 @@ | |||
| import py | ||||
| import os, sys | ||||
| from py.__.io import terminalwriter  | ||||
| import StringIO | ||||
| 
 | ||||
| def skip_win32(): | ||||
|     if sys.platform == 'win32': | ||||
|  | @ -23,12 +22,23 @@ def test_terminalwriter_default_instantiation(): | |||
| 
 | ||||
| def test_terminalwriter_dumb_term_no_markup(monkeypatch): | ||||
|     monkeypatch.setattr(os, 'environ', {'TERM': 'dumb', 'PATH': ''}) | ||||
|     monkeypatch.setattr(sys, 'stdout', StringIO.StringIO()) | ||||
|     monkeypatch.setattr(sys.stdout, 'isatty', lambda:True) | ||||
|     class MyFile: | ||||
|         def isatty(self): | ||||
|             return True | ||||
|     monkeypatch.setattr(sys, 'stdout', MyFile()) | ||||
|     assert sys.stdout.isatty() | ||||
|     tw = py.io.TerminalWriter() | ||||
|     assert not tw.hasmarkup | ||||
| 
 | ||||
| def test_unicode_encoding(): | ||||
|     l = [] | ||||
|     msg = unicode('b\u00f6y', 'utf8') | ||||
|     for encoding in 'utf8', 'latin1': | ||||
|         tw = py.io.TerminalWriter(l.append) | ||||
|         tw._encoding = encoding | ||||
|         tw.line(msg) | ||||
|         assert l[0] == msg.encode(encoding) | ||||
| 
 | ||||
| class BaseTests: | ||||
|     def test_line(self):     | ||||
|         tw = self.getwriter() | ||||
|  | @ -44,8 +54,7 @@ class BaseTests: | |||
|             msg = unicode('b\u00f6y', 'utf8') | ||||
|             tw.line(msg) | ||||
|             l = self.getlines() | ||||
|             assert not isinstance(l[0], unicode)  | ||||
|             assert unicode(l[0], encoding) == msg + "\n" | ||||
|             assert l[0] == msg + "\n" | ||||
| 
 | ||||
|     def test_sep_no_title(self): | ||||
|         tw = self.getwriter() | ||||
|  | @ -105,7 +114,7 @@ class TestTmpfile(BaseTests): | |||
|         io.flush() | ||||
|         return self.path.open('r').readlines() | ||||
| 
 | ||||
| class TestStringIO(BaseTests): | ||||
| class TestWithStringIO(BaseTests): | ||||
|     def getwriter(self): | ||||
|         self.tw = py.io.TerminalWriter(stringio=True) | ||||
|         return self.tw | ||||
|  | @ -120,7 +129,7 @@ class TestCallableFile(BaseTests): | |||
|         return py.io.TerminalWriter(self.writes.append) | ||||
| 
 | ||||
|     def getlines(self): | ||||
|         io = py.std.cStringIO.StringIO() | ||||
|         io = py.io.TextIO() | ||||
|         io.write("".join(self.writes)) | ||||
|         io.seek(0) | ||||
|         return io.readlines() | ||||
|  |  | |||
|  | @ -170,61 +170,6 @@ class TestRealModule: | |||
|         import realtest.x.module | ||||
|         assert realtest.x.module.__doc__ == 'test module' | ||||
| 
 | ||||
| #class TestStdHook: | ||||
| #    """Tests imports for the standard Python library hook.""" | ||||
| # | ||||
| #    def setup_method(self, *args): | ||||
| #        """Unload the test modules before each test.""" | ||||
| #        module_names = ['py.std.StringIO', 'py.std', 'py'] | ||||
| #        for modname in module_names: | ||||
| #            if modname in sys.modules: | ||||
| #                del sys.modules[modname] | ||||
| # | ||||
| #    def test_std_import_simple(self): | ||||
| #        import py | ||||
| #        StringIO = py.std.StringIO | ||||
| #        assert 'py' in sys.modules | ||||
| #        assert 'py.std' in sys.modules | ||||
| #        assert 'py.std.StringIO' in sys.modules | ||||
| #        assert hasattr(py.std.StringIO, 'StringIO') | ||||
| # | ||||
| #    def test_std_import0(self): | ||||
| #        """Testing 'import py.std.StringIO'.""" | ||||
| #        import py.std.StringIO | ||||
| #        assert 'py' in sys.modules | ||||
| #        assert 'py.std' in sys.modules | ||||
| #        assert 'py.std.StringIO' in sys.modules | ||||
| #        assert hasattr(py.std.StringIO, 'StringIO') | ||||
| # | ||||
| #    def test_std_import1(self): | ||||
| #        """Testing 'from py import std'.""" | ||||
| #        from py import std | ||||
| #        assert 'py' in sys.modules | ||||
| #        assert 'py.std' in sys.modules | ||||
| # | ||||
| #    def test_std_from(self): | ||||
| #        """Testing 'from py.std import StringIO'.""" | ||||
| #        from py.std import StringIO | ||||
| #        assert getattr(StringIO, 'StringIO') | ||||
| # | ||||
| #    def test_std_star(self): | ||||
| #        "Test from py.std.string import *" | ||||
| #        """Testing 'from test.module import *'.""" | ||||
| #        tmpdir = py.test.ensuretemp('test_initpkg') | ||||
| #        tfile = tmpdir.join('stdstartest.py') | ||||
| #        tfile.write(py.code.Source("""if True: | ||||
| #            from realtest.module import * | ||||
| #            globals()['mytest0'] | ||||
| #            globals()['mytest1'] | ||||
| #            globals()['MyTest'] | ||||
| #        """)) | ||||
| #        import stdstartest  # an exception will be raise if an error occurs | ||||
| 
 | ||||
| ##def test_help(): | ||||
| #    help(std.path) | ||||
| #    #assert False | ||||
| 
 | ||||
| 
 | ||||
| def test_autoimport(): | ||||
|     from py.initpkg import autoimport | ||||
|     py.std.os.environ['AUTOTEST_AUTOIMPORT'] = "nonexistmodule" | ||||
|  |  | |||
|  | @ -224,7 +224,7 @@ class TestSvnURLAuth(object): | |||
| 
 | ||||
|     def test_log(self): | ||||
|         u = svnurl_no_svn('http://foo.bar/svn/foo', auth=self.auth) | ||||
|         u.popen_output = py.std.StringIO.StringIO('''\ | ||||
|         u.popen_output = py.io.TextIO('''\ | ||||
| <?xml version="1.0"?> | ||||
| <log> | ||||
| <logentry revision="51381"> | ||||
|  |  | |||
|  | @ -12,7 +12,6 @@ | |||
| 
 | ||||
| """ | ||||
| 
 | ||||
| from cStringIO import StringIO | ||||
| from pickle import Pickler, Unpickler | ||||
| import py | ||||
| from py.__.execnet.channel import Channel | ||||
|  | @ -58,14 +57,14 @@ class ImmutablePickler: | |||
|         # this is for feeding objects to ourselfes | ||||
|         # which be the case e.g. if you want to pickle  | ||||
|         # from a forked process back to the original  | ||||
|         f = StringIO() | ||||
|         f = py.io.BytesIO() | ||||
|         pickler = MyPickler(f, self._protocol, uneven=self.uneven) | ||||
|         pickler.memo = self._picklememo | ||||
|         pickler.memoize(obj) | ||||
|         self._updateunpicklememo() | ||||
| 
 | ||||
|     def dumps(self, obj): | ||||
|         f = StringIO() | ||||
|         f = py.io.BytesIO() | ||||
|         pickler = MyPickler(f, self._protocol, uneven=self.uneven) | ||||
|         pickler.memo = self._picklememo | ||||
|         pickler.dump(obj) | ||||
|  | @ -76,7 +75,7 @@ class ImmutablePickler: | |||
|         return f.getvalue() | ||||
| 
 | ||||
|     def loads(self, string): | ||||
|         f = StringIO(string) | ||||
|         f = py.io.BytesIO(string) | ||||
|         unpickler = Unpickler(f) | ||||
|         unpickler.memo = self._unpicklememo | ||||
|         res = unpickler.load() | ||||
|  |  | |||
|  | @ -72,9 +72,6 @@ class TestPickleChannelFunctional: | |||
|         cls.gw = py.execnet.PopenGateway() | ||||
|         cls.gw.remote_init_threads(5) | ||||
| 
 | ||||
|     def teardown_class(cls): | ||||
|         cls.gw.exit() | ||||
| 
 | ||||
|     def test_popen_send_instance(self): | ||||
|         channel = self.gw.remote_exec(""" | ||||
|             from py.__.test.dist.mypickle import PickleChannel | ||||
|  |  | |||
|  | @ -26,8 +26,8 @@ on tests that wait on reading something from stdin. | |||
| You can influence output capturing mechanisms from the command line:: | ||||
| 
 | ||||
|     py.test -s            # disable all capturing | ||||
|     py.test --capture=sys # set StringIO() to each of sys.stdout/stderr  | ||||
|     py.test --capture=fd  # capture stdout/stderr on Filedescriptors 1/2  | ||||
|     py.test --capture=sys # replace sys.stdout/stderr with in-mem files | ||||
|     py.test --capture=fd  # point filedescriptors 1 and 2 to temp file | ||||
| 
 | ||||
| If you set capturing values in a conftest file like this:: | ||||
| 
 | ||||
|  | @ -40,7 +40,9 @@ sys-level capturing | |||
| ------------------------------------------ | ||||
| 
 | ||||
| Capturing on 'sys' level means that ``sys.stdout`` and ``sys.stderr``  | ||||
| will be replaced with StringIO() objects.    | ||||
| will be replaced with in-memory files (``py.io.TextIO`` to be precise)   | ||||
| that capture writes and decode non-unicode strings to a unicode object | ||||
| (using a default, usually, UTF-8, encoding).  | ||||
| 
 | ||||
| FD-level capturing and subprocesses | ||||
| ------------------------------------------ | ||||
|  | @ -114,7 +116,7 @@ class CaptureManager: | |||
|         return EncodedFile(newf, encoding) | ||||
| 
 | ||||
|     def _makestringio(self): | ||||
|         return py.std.StringIO.StringIO()  | ||||
|         return EncodedFile(py.io.TextIO(), 'UTF-8') | ||||
| 
 | ||||
|     def _startcapture(self, method): | ||||
|         if method == "fd":  | ||||
|  |  | |||
|  | @ -445,7 +445,7 @@ def test_reportrecorder(testdir): | |||
| 
 | ||||
| class LineComp: | ||||
|     def __init__(self): | ||||
|         self.stringio = py.std.StringIO.StringIO() | ||||
|         self.stringio = py.io.TextIO() | ||||
| 
 | ||||
|     def assert_contains_lines(self, lines2): | ||||
|         """ assert that lines2 are contained (linearly) in lines1.  | ||||
|  |  | |||
|  | @ -90,7 +90,7 @@ class ResultLog(object): | |||
| # | ||||
| # =============================================================================== | ||||
| 
 | ||||
| import os, StringIO | ||||
| import os | ||||
| 
 | ||||
| def test_generic_path(): | ||||
|     from py.__.test.collect import Node, Item, FSCollector | ||||
|  | @ -115,7 +115,7 @@ def test_generic_path(): | |||
| 
 | ||||
| def test_write_log_entry(): | ||||
|     reslog = ResultLog(None) | ||||
|     reslog.logfile = StringIO.StringIO() | ||||
|     reslog.logfile = py.io.TextIO() | ||||
|     reslog.write_log_entry('name', '.', '')   | ||||
|     entry = reslog.logfile.getvalue() | ||||
|     assert entry[-1] == '\n'         | ||||
|  | @ -123,7 +123,7 @@ def test_write_log_entry(): | |||
|     assert len(entry_lines) == 1 | ||||
|     assert entry_lines[0] == '. name' | ||||
| 
 | ||||
|     reslog.logfile = StringIO.StringIO() | ||||
|     reslog.logfile = py.io.TextIO() | ||||
|     reslog.write_log_entry('name', 's', 'Skipped')   | ||||
|     entry = reslog.logfile.getvalue() | ||||
|     assert entry[-1] == '\n'         | ||||
|  | @ -132,7 +132,7 @@ def test_write_log_entry(): | |||
|     assert entry_lines[0] == 's name' | ||||
|     assert entry_lines[1] == ' Skipped' | ||||
| 
 | ||||
|     reslog.logfile = StringIO.StringIO() | ||||
|     reslog.logfile = py.io.TextIO() | ||||
|     reslog.write_log_entry('name', 's', 'Skipped\n')   | ||||
|     entry = reslog.logfile.getvalue() | ||||
|     assert entry[-1] == '\n'         | ||||
|  | @ -141,7 +141,7 @@ def test_write_log_entry(): | |||
|     assert entry_lines[0] == 's name' | ||||
|     assert entry_lines[1] == ' Skipped' | ||||
| 
 | ||||
|     reslog.logfile = StringIO.StringIO() | ||||
|     reslog.logfile = py.io.TextIO() | ||||
|     longrepr = ' tb1\n tb 2\nE tb3\nSome Error' | ||||
|     reslog.write_log_entry('name', 'F', longrepr) | ||||
|     entry = reslog.logfile.getvalue() | ||||
|  | @ -212,7 +212,7 @@ class TestWithFunctionIntegration: | |||
|             raise ValueError | ||||
|         except ValueError: | ||||
|             excinfo = py.code.ExceptionInfo() | ||||
|         reslog = ResultLog(StringIO.StringIO())         | ||||
|         reslog = ResultLog(py.io.TextIO())         | ||||
|         reslog.pytest_internalerror(excinfo.getrepr()) | ||||
|         entry = reslog.logfile.getvalue() | ||||
|         entry_lines = entry.splitlines() | ||||
|  |  | |||
|  | @ -71,7 +71,7 @@ def test_capturing_unicode(testdir, method): | |||
| def test_capturing_bytes_in_utf8_encoding(testdir, method): | ||||
|     testdir.makepyfile(""" | ||||
|         def test_unicode(): | ||||
|             print '\\xe2' | ||||
|             print 'b\\u00f6y' | ||||
|     """) | ||||
|     result = testdir.runpytest("--capture=%s" % method) | ||||
|     result.stdout.fnmatch_lines([ | ||||
|  | @ -227,8 +227,8 @@ class TestLoggingInteraction: | |||
|         p = testdir.makepyfile(""" | ||||
|             def test_logging(): | ||||
|                 import logging | ||||
|                 import StringIO | ||||
|                 stream = StringIO.StringIO() | ||||
|                 import py | ||||
|                 stream = py.io.TextIO() | ||||
|                 logging.basicConfig(stream=stream) | ||||
|                 stream.close() # to free memory/release resources | ||||
|         """) | ||||
|  |  | |||
|  | @ -139,7 +139,7 @@ class TestTerminal: | |||
| 
 | ||||
|     def test_writeline(self, testdir, linecomp): | ||||
|         modcol = testdir.getmodulecol("def test_one(): pass") | ||||
|         stringio = py.std.cStringIO.StringIO() | ||||
|         stringio = py.io.TextIO() | ||||
|         rep = TerminalReporter(modcol.config, file=linecomp.stringio) | ||||
|         rep.write_fspath_result(py.path.local("xy.py"), '.') | ||||
|         rep.write_line("hello world") | ||||
|  |  | |||
|  | @ -117,7 +117,7 @@ class PluginManager(object): | |||
|         # ===================================================== | ||||
|         methods = collectattr(plugin) | ||||
|         hooks = collectattr(hookspec) | ||||
|         stringio = py.std.StringIO.StringIO() | ||||
|         stringio = py.io.TextIO() | ||||
|         def Print(*args): | ||||
|             if args: | ||||
|                 stringio.write(" ".join(map(str, args))) | ||||
|  |  | |||
|  | @ -143,7 +143,7 @@ class TestConfigPickling: | |||
|         testdir.makepyfile(hello="def test_x(): pass") | ||||
|         config = testdir.parseconfig(tmpdir) | ||||
|         col = config.getfsnode(config.topdir) | ||||
|         io = py.std.cStringIO.StringIO() | ||||
|         io = py.io.TextIO() | ||||
|         pickler = Pickler(io) | ||||
|         pickler.dump(col) | ||||
|         io.seek(0)  | ||||
|  | @ -160,7 +160,7 @@ class TestConfigPickling: | |||
|         col = config.getfsnode(config.topdir) | ||||
|         col1 = col.join(dir1.basename) | ||||
|         assert col1.parent is col  | ||||
|         io = py.std.cStringIO.StringIO() | ||||
|         io = py.io.TextIO() | ||||
|         pickler = Pickler(io) | ||||
|         pickler.dump(col) | ||||
|         pickler.dump(col1) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue