Commit e22a5082 authored by Mike Hommey's avatar Mike Hommey
Browse files

Bug 1257516 - Add a file-like class that sends writes to a callback. r=ted

parent cf67fa8b
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -96,3 +96,36 @@ class ConfigureOutputHandler(logging.Handler):
            raise
        except:
            self.handleError(record)


class LineIO(object):
    '''File-like class that sends each line of the written data to a callback
    (without carriage returns).
    '''
    def __init__(self, callback):
        self._callback = callback
        self._buf = ''

    def write(self, buf):
        lines = buf.splitlines()
        if not lines:
            return
        if self._buf:
            lines[0] = self._buf + lines[0]
            self._buf = ''
        if not buf.endswith('\n'):
            self._buf = lines.pop()

        for line in lines:
            self._callback(line)

    def close(self):
        if self._buf:
            self._callback(self._buf)
            self._buf = ''

    def __enter__(self):
        return self

    def __exit__(self, *args):
        self.close()
+45 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ from mozunit import main

from mozbuild.configure.util import (
    ConfigureOutputHandler,
    LineIO,
    Version,
)

@@ -176,6 +177,50 @@ class TestConfigureOutputHandler(unittest.TestCase):
            os.remove(path)


class TestLineIO(unittest.TestCase):
    def test_lineio(self):
        lines = []
        l = LineIO(lambda l: lines.append(l))

        l.write('a')
        self.assertEqual(lines, [])

        l.write('b')
        self.assertEqual(lines, [])

        l.write('\n')
        self.assertEqual(lines, ['ab'])

        l.write('cdef')
        self.assertEqual(lines, ['ab'])

        l.write('\n')
        self.assertEqual(lines, ['ab', 'cdef'])

        l.write('ghi\njklm')
        self.assertEqual(lines, ['ab', 'cdef', 'ghi'])

        l.write('nop\nqrst\nuv\n')
        self.assertEqual(lines, ['ab', 'cdef', 'ghi', 'jklmnop', 'qrst', 'uv'])

        l.write('wx\nyz')
        self.assertEqual(lines, ['ab', 'cdef', 'ghi', 'jklmnop', 'qrst', 'uv',
                                 'wx'])

        l.close()
        self.assertEqual(lines, ['ab', 'cdef', 'ghi', 'jklmnop', 'qrst', 'uv',
                                 'wx', 'yz'])

    def test_lineio_contextmanager(self):
        lines = []
        with LineIO(lambda l: lines.append(l)) as l:
            l.write('a\nb\nc')

            self.assertEqual(lines, ['a', 'b'])

        self.assertEqual(lines, ['a', 'b', 'c'])


class TestVersion(unittest.TestCase):
    def test_version_simple(self):
        v = Version('1')