[py-svn] commit/py: hpk42: improve terminalwriter reline/line printing behaviour (as used by detox)

Bitbucket commits-noreply at bitbucket.org
Sat Jun 9 13:11:14 CEST 2012


1 new commit in py:


https://bitbucket.org/hpk42/py/changeset/4dfde5019cb3/
changeset:   4dfde5019cb3
user:        hpk42
date:        2012-06-09 13:11:04
summary:     improve terminalwriter reline/line printing behaviour (as used by detox)
affected #:  3 files

diff -r 3b13d4cc842450768ad74639a5612c2d18114479 -r 4dfde5019cb35a1506aca3607d7de5245f762335 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,8 @@
 - changed iniconfig parsing to better conform, now the chars ";"
   and "#" only mark a comment at the stripped start of a line
 - include recent apipkg-1.2
+- change internal terminalwriter.line/reline logic to more nicely
+  support file spinners
 
 Changes between 1.4.7 and 1.4.8
 ==================================================


diff -r 3b13d4cc842450768ad74639a5612c2d18114479 -r 4dfde5019cb35a1506aca3607d7de5245f762335 py/_io/terminalwriter.py
--- a/py/_io/terminalwriter.py
+++ b/py/_io/terminalwriter.py
@@ -105,8 +105,6 @@
                      Blue=44, Purple=45, Cyan=46, White=47,
                      bold=1, light=2, blink=5, invert=7)
 
-    _newline = None   # the last line printed
-
     # XXX deprecate stringio argument
     def __init__(self, file=None, stringio=False, encoding=None):
         if file is None:
@@ -120,6 +118,7 @@
         self._file = file
         self.fullwidth = get_terminal_width()
         self.hasmarkup = should_do_markup(file)
+        self._lastlen = 0
 
     def _escaped(self, text, esc):
         if esc and self.hasmarkup:
@@ -182,31 +181,22 @@
         return s
 
     def line(self, s='', **kw):
-        if self._newline == False:
-            self.write("\n")
         self.write(s, **kw)
+        self._checkfill(s)
         self.write('\n')
-        self._newline = True
 
-    def reline(self, line, **opts):
+    def reline(self, line, **kw):
         if not self.hasmarkup:
             raise ValueError("cannot use rewrite-line without terminal")
-        if not self._newline:
-            self.write("\r")
-        self.write(line, **opts)
-        # see if we need to fill up some spaces at the end
-        # xxx have a more exact lastlinelen working from self.write?
-        lenline = len(line)
-        try:
-            lastlen = self._lastlinelen
-        except AttributeError:
-            pass
-        else:
-            if lenline < lastlen:
-                self.write(" " * (lastlen - lenline + 1))
-        self._lastlinelen = lenline
-        self._newline = False
+        self.write(line, **kw)
+        self._checkfill(line)
+        self.write('\r')
+        self._lastlen = len(line)
 
+    def _checkfill(self, line):
+        diff2last = self._lastlen - len(line)
+        if diff2last > 0:
+            self.write(" " * diff2last)
 
 class Win32ConsoleWriter(TerminalWriter):
     def write(self, s, **kw):


diff -r 3b13d4cc842450768ad74639a5612c2d18114479 -r 4dfde5019cb35a1506aca3607d7de5245f762335 testing/io_/test_terminalwriter.py
--- a/testing/io_/test_terminalwriter.py
+++ b/testing/io_/test_terminalwriter.py
@@ -106,6 +106,7 @@
                 io.seek(0)
                 return io.readlines()
         tw.getlines = getlines
+        tw.getvalue = lambda: "".join(getlines())
         return tw
 
     def test_line(self, tw):
@@ -170,18 +171,19 @@
         pytest.raises(ValueError, lambda: tw.reline("x"))
         tw.hasmarkup = True
         tw.reline("0 1 2")
-        l = "".join(tw.getlines()).split("\n")
+        tw.getlines()
+        l = tw.getvalue().split("\n")
         assert len(l) == 2
         tw.reline("0 1 3")
-        l = "".join(tw.getlines()).split("\n")
+        l = tw.getvalue().split("\n")
         assert len(l) == 2
-        assert l[1].endswith("\r0 1 3")
-        tw.line("something")
-        l = "".join(tw.getlines()).split("\n")
-        assert len(l) == 4
+        assert l[1].endswith("0 1 3\r")
+        tw.line("so")
+        l = tw.getvalue().split("\n")
+        assert len(l) == 3
         assert l[-1] == ""
-        out = "\n".join(l)
-        assert out.endswith("\nsomething\n")
+        assert l[1] == ("0 1 2\r0 1 3\rso   ")
+        assert l[0] == "hello"

Repository URL: https://bitbucket.org/hpk42/py/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.



More information about the pytest-commit mailing list