Просмотр исходного кода

Update unit tests for stream_output to match the behaviour of a docker-py response.

Signed-off-by: Daniel Nephin <[email protected]>
Daniel Nephin 10 лет назад
Родитель
Сommit
71ff872e8e

+ 1 - 2
compose/cli/log_printer.py

@@ -4,13 +4,12 @@ from __future__ import unicode_literals
 import sys
 from itertools import cycle
 
-import six
 from six import next
 
-from compose import utils
 from . import colors
 from .multiplexer import Multiplexer
 from .utils import split_buffer
+from compose import utils
 
 
 class LogPrinter(object):

+ 4 - 4
compose/progress_stream.py

@@ -1,8 +1,9 @@
-import codecs
 import json
 
 import six
 
+from compose import utils
+
 
 class StreamOutputError(Exception):
     pass
@@ -10,14 +11,13 @@ class StreamOutputError(Exception):
 
 def stream_output(output, stream):
     is_terminal = hasattr(stream, 'isatty') and stream.isatty()
-    if not six.PY3:
-        stream = codecs.getwriter('utf-8')(stream)
+    stream = utils.get_output_stream(stream)
     all_events = []
     lines = {}
     diff = 0
 
     for chunk in output:
-        if six.PY3 and not isinstance(chunk, str):
+        if six.PY3:
             chunk = chunk.decode('utf-8')
         event = json.loads(chunk)
         all_events.append(event)

+ 2 - 2
compose/project.py

@@ -324,11 +324,11 @@ class Project(object):
         else:
             service_names = self.service_names
 
-        containers = filter(None, [
+        containers = list(filter(None, [
             Container.from_ps(self.client, container)
             for container in self.client.containers(
                 all=stopped,
-                filters={'label': self.labels(one_off=one_off)})])
+                filters={'label': self.labels(one_off=one_off)})]))
 
         def matches_service_names(container):
             return container.labels.get(LABEL_SERVICE) in service_names

+ 2 - 0
compose/service.py

@@ -710,6 +710,8 @@ class Service(object):
         log.info('Building %s...' % self.name)
 
         path = self.options['build']
+        # python2 os.path() doesn't support unicode, so we need to encode it to
+        # a byte string
         if not six.PY3:
             path = path.encode('utf8')
 

+ 8 - 1
compose/utils.py

@@ -5,6 +5,7 @@ import logging
 import sys
 from threading import Thread
 
+import six
 from docker.errors import APIError
 from six.moves.queue import Empty
 from six.moves.queue import Queue
@@ -18,7 +19,7 @@ def parallel_execute(objects, obj_callable, msg_index, msg):
     For a given list of objects, call the callable passing in the first
     object we give it.
     """
-    stream = codecs.getwriter('utf-8')(sys.stdout)
+    stream = get_output_stream()
     lines = []
     errors = {}
 
@@ -70,6 +71,12 @@ def parallel_execute(objects, obj_callable, msg_index, msg):
             stream.write("ERROR: for {}  {} \n".format(error, errors[error]))
 
 
+def get_output_stream(stream=sys.stdout):
+    if six.PY3:
+        return stream
+    return codecs.getwriter('utf-8')(stream)
+
+
 def write_out_msg(stream, lines, msg_index, msg, status="done"):
     """
     Using special ANSI code characters we can write out the msg over the top of

+ 2 - 2
tests/integration/legacy_test.py

@@ -1,8 +1,8 @@
 import unittest
 
 from docker.errors import APIError
-from mock import Mock
 
+from .. import mock
 from .testcases import DockerClientTestCase
 from compose import legacy
 from compose.project import Project
@@ -66,7 +66,7 @@ class UtilitiesTestCase(unittest.TestCase):
         )
 
     def test_get_legacy_containers(self):
-        client = Mock()
+        client = mock.Mock()
         client.containers.return_value = [
             {
                 "Id": "abc123",

+ 9 - 9
tests/unit/progress_stream_test.py

@@ -10,27 +10,27 @@ from tests import unittest
 class ProgressStreamTestCase(unittest.TestCase):
     def test_stream_output(self):
         output = [
-            '{"status": "Downloading", "progressDetail": {"current": '
-            '31019763, "start": 1413653874, "total": 62763875}, '
-            '"progress": "..."}',
+            b'{"status": "Downloading", "progressDetail": {"current": '
+            b'31019763, "start": 1413653874, "total": 62763875}, '
+            b'"progress": "..."}',
         ]
         events = progress_stream.stream_output(output, StringIO())
         self.assertEqual(len(events), 1)
 
     def test_stream_output_div_zero(self):
         output = [
-            '{"status": "Downloading", "progressDetail": {"current": '
-            '0, "start": 1413653874, "total": 0}, '
-            '"progress": "..."}',
+            b'{"status": "Downloading", "progressDetail": {"current": '
+            b'0, "start": 1413653874, "total": 0}, '
+            b'"progress": "..."}',
         ]
         events = progress_stream.stream_output(output, StringIO())
         self.assertEqual(len(events), 1)
 
     def test_stream_output_null_total(self):
         output = [
-            '{"status": "Downloading", "progressDetail": {"current": '
-            '0, "start": 1413653874, "total": null}, '
-            '"progress": "..."}',
+            b'{"status": "Downloading", "progressDetail": {"current": '
+            b'0, "start": 1413653874, "total": null}, '
+            b'"progress": "..."}',
         ]
         events = progress_stream.stream_output(output, StringIO())
         self.assertEqual(len(events), 1)

+ 1 - 1
tests/unit/service_test.py

@@ -280,7 +280,7 @@ class ServiceTest(unittest.TestCase):
 
     def test_build_does_not_pull(self):
         self.mock_client.build.return_value = [
-            '{"stream": "Successfully built 12345"}',
+            b'{"stream": "Successfully built 12345"}',
         ]
 
         service = Service('foo', client=self.mock_client, build='.')