From c8266ad9e967c71855025aed304183d70e1bf326 Mon Sep 17 00:00:00 2001 From: Chuck Short Date: Thu, 3 Nov 2016 14:49:04 -0400 Subject: [PATCH] Add python3 support Add support for python3 using the six library. Change-Id: I90851ddf5a98ca05c494a49e4063e1bd233cccee Signed-off-by: Chuck Short --- monascastatsd/connection.py | 7 ++--- requirements.txt | 2 +- tests/test_monascastatsd.py | 51 ++++++++++++++++++++++++++----------- tox.ini | 2 +- 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/monascastatsd/connection.py b/monascastatsd/connection.py index beb4354..d9830a5 100644 --- a/monascastatsd/connection.py +++ b/monascastatsd/connection.py @@ -17,10 +17,7 @@ import logging import random import socket -try: - import itertools -except ImportError: - imap = map +from six.moves import map logging.basicConfig() log = logging.getLogger(__name__) @@ -93,7 +90,7 @@ class Connection(object): payload.extend(["|#"]) payload.append(dimensions) - encoded = "".join(itertools.imap(str, payload)) + encoded = "".join(map(str, payload)) self._send(encoded) def _send_to_server(self, packet): diff --git a/requirements.txt b/requirements.txt index 2683dd4..08c2a88 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ # The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. - +six>=1.9.0 # MIT diff --git a/tests/test_monascastatsd.py b/tests/test_monascastatsd.py index cd28152..f043bdf 100644 --- a/tests/test_monascastatsd.py +++ b/tests/test_monascastatsd.py @@ -24,6 +24,8 @@ import unittest import monascastatsd as mstatsd import mock +import six +from six.moves import range class FakeSocket(object): @@ -80,35 +82,35 @@ class TestMonascaStatsd(unittest.TestCase): counter = self.client.get_counter(name='page.views') counter.increment() - self.assertEqual("page.views:1|c|#{'env': 'test'}", + self.assertEqual(six.b("page.views:1|c|#{'env': 'test'}"), self.recv(counter)) counter += 1 - self.assertEqual("page.views:1|c|#{'env': 'test'}", + self.assertEqual(six.b("page.views:1|c|#{'env': 'test'}"), self.recv(counter)) counter.increment(11) - self.assertEqual("page.views:11|c|#{'env': 'test'}", + self.assertEqual(six.b("page.views:11|c|#{'env': 'test'}"), self.recv(counter)) counter += 11 - self.assertEqual("page.views:11|c|#{'env': 'test'}", + self.assertEqual(six.b("page.views:11|c|#{'env': 'test'}"), self.recv(counter)) counter.decrement() - self.assertEqual("page.views:-1|c|#{'env': 'test'}", + self.assertEqual(six.b("page.views:-1|c|#{'env': 'test'}"), self.recv(counter)) counter -= 1 - self.assertEqual("page.views:-1|c|#{'env': 'test'}", + self.assertEqual(six.b("page.views:-1|c|#{'env': 'test'}"), self.recv(counter)) counter.decrement(12) - self.assertEqual("page.views:-12|c|#{'env': 'test'}", + self.assertEqual(six.b("page.views:-12|c|#{'env': 'test'}"), self.recv(counter)) counter -= 12 - self.assertEqual("page.views:-12|c|#{'env': 'test'}", + self.assertEqual(six.b("page.views:-12|c|#{'env': 'test'}"), self.recv(counter)) def test_counter_with_dimensions(self): @@ -118,6 +120,9 @@ class TestMonascaStatsd(unittest.TestCase): counter.increment(dimensions={'country': 'canada', 'color': 'red'}) result = self.recv(counter) + if isinstance(result, bytes): + result = result.decode('utf-8') + self.assertRegexpMatches(result, "counter_with_dims:1|c|#{") self.assertRegexpMatches(result, "'country': 'canada'") self.assertRegexpMatches(result, "'date': '10/24'") @@ -128,6 +133,9 @@ class TestMonascaStatsd(unittest.TestCase): counter += 1 result = self.recv(counter) + if isinstance(result, bytes): + result = result.decode('utf-8') + self.assertRegexpMatches(result, "counter_with_dims:1|c|#{") self.assertRegexpMatches(result, "'date': '10/24'") self.assertRegexpMatches(result, "'env': 'test'") @@ -136,7 +144,11 @@ class TestMonascaStatsd(unittest.TestCase): def test_gauge(self): gauge = self.client.get_gauge('gauge') gauge.send('metric', 123.4) - assert self.recv(gauge) == "gauge.metric:123.4|g|#{'env': 'test'}" + result = self.recv(gauge) + if isinstance(result, bytes): + result = result.decode('utf-8') + + assert result == "gauge.metric:123.4|g|#{'env': 'test'}" def test_gauge_with_dimensions(self): gauge = self.client.get_gauge('gauge') @@ -146,6 +158,9 @@ class TestMonascaStatsd(unittest.TestCase): 'color': 'blue'}) result = self.recv(gauge) + if isinstance(result, bytes): + result = result.decode('utf-8') + self.assertRegexpMatches(result, "gauge.gt:123.4|g|#{") self.assertRegexpMatches(result, "'country': 'china'") self.assertRegexpMatches(result, "'age': 45") @@ -161,7 +176,7 @@ class TestMonascaStatsd(unittest.TestCase): self.assert_almost_equal(3000, len(self.client.connection.socket.payloads), 150) - self.assertEqual("sampled_counter:1|c|@0.3|#{'env': 'test'}", self.recv(counter)) + self.assertEqual(six.b("sampled_counter:1|c|@0.3|#{'env': 'test'}"), self.recv(counter)) def test_samples_with_dimensions(self): gauge = self.client.get_gauge() @@ -174,13 +189,16 @@ class TestMonascaStatsd(unittest.TestCase): def test_timing(self): timer = self.client.get_timer() timer.timing('t', 123) - self.assertEqual("t:123|g|#{'env': 'test'}", self.recv(timer)) + self.assertEqual(six.b("t:123|g|#{'env': 'test'}"), self.recv(timer)) def test_time(self): timer = self.client.get_timer() with timer.time('t'): time.sleep(2) packet = self.recv(timer) + if isinstance(packet, bytes): + packet = packet.decode("utf-8") + name_value, type_, dimensions = packet.split('|') name, value = name_value.split(':') @@ -206,6 +224,9 @@ class TestMonascaStatsd(unittest.TestCase): self.assertEqual(result, (1, 2, 1, 3)) packet = self.recv(timer) + if isinstance(packet, bytes): + packet = packet.decode("utf-8") + name_value, type_, dimensions = packet.split('|') name, value = name_value.split(':') @@ -228,7 +249,7 @@ class TestMonascaStatsd(unittest.TestCase): timer.timing('timer', 123) self.client.connection.close_buffer() - self.assertEqual("site.views:123|g|#{'env': 'test'}\nsite.timer:123|g|#{'env': 'test'}", + self.assertEqual(six.b("site.views:123|g|#{'env': 'test'}\nsite.timer:123|g|#{'env': 'test'}"), self.recv(gauge)) def test_context_manager(self): @@ -239,7 +260,7 @@ class TestMonascaStatsd(unittest.TestCase): client.get_gauge('page').send('views', 123) client.get_timer('page').timing('timer', 12) - self.assertEqual('ContextTester.page.views:123|g\nContextTester.page.timer:12|g', + self.assertEqual(six.b('ContextTester.page.views:123|g\nContextTester.page.timer:12|g'), fake_socket.recv()) def test_batched_buffer_autoflush(self): @@ -250,10 +271,10 @@ class TestMonascaStatsd(unittest.TestCase): counter = client.get_counter('mycounter') for _ in range(51): counter.increment() - self.assertEqual('\n'.join(['BufferedTester.mycounter:1|c' for _ in range(50)]), + self.assertEqual(six.b('\n'.join(['BufferedTester.mycounter:1|c' for _ in range(50)])), fake_socket.recv()) - self.assertEqual('BufferedTester.mycounter:1|c', fake_socket.recv()) + self.assertEqual(six.b('BufferedTester.mycounter:1|c'), fake_socket.recv()) @staticmethod def assert_almost_equal(a, b, delta): diff --git a/tox.ini b/tox.ini index 3ed1114..d796d26 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py27,pep8 +envlist = py35,py27,pep8 minversion = 1.6 skipsdist = True