From 7c9a8bc383b0155e860d0c454b8f44e2b02a85fa Mon Sep 17 00:00:00 2001 From: naemono Date: Tue, 21 Nov 2017 09:14:40 -0600 Subject: [PATCH 1/2] Python3 does not have a 'long' type Resolves #48 --- circle.yml | 2 +- objectrocket/util.py | 6 ++++-- requirements/dev.txt | 1 + tox.ini | 3 +-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/circle.yml b/circle.yml index 52d0f3f..1a85f0d 100644 --- a/circle.yml +++ b/circle.yml @@ -7,7 +7,7 @@ machine: dependencies: override: - - pip install -r requirements/prod.txt -r requirements/dev.txt + - pip install -r requirements/dev.txt - pip install tox-pyenv codecov coveralls twine - pyenv local 2.7.10 3.5.0 diff --git a/objectrocket/util.py b/objectrocket/util.py index 927c1ac..de220e3 100644 --- a/objectrocket/util.py +++ b/objectrocket/util.py @@ -1,6 +1,8 @@ """Utility code for the objectrocket package.""" import functools import datetime +import six +import sys from six import create_bound_method @@ -68,7 +70,7 @@ def sum_values(value1, value2): if value2 is None: return value1 - number_types = (int, float, long, bool) # noqa + number_types = (float, bool) + six.integer_types # noqa if isinstance(value1, number_types) and isinstance(value2, number_types): return int(value1 + value2) @@ -81,7 +83,7 @@ def sum_values(value1, value2): if isinstance(value1, list): return list(set(value1 + value2)) - elif isinstance(value1, str) or isinstance(value1, datetime.datetime) or isinstance(value1, unicode): # noqa + elif isinstance(value1, str) or isinstance(value1, datetime.datetime) or isinstance(value1, six.text_type): # noqa return value1 elif isinstance(value1, dict): keys = set(value1.iterkeys()) | set(value2.iterkeys()) diff --git a/requirements/dev.txt b/requirements/dev.txt index 681de6c..a4f3ca1 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,3 +1,4 @@ +-r prod.txt Sphinx>=1.2.2 flake8>=2.1.0 mock>=1.0.1 diff --git a/tox.ini b/tox.ini index 472a583..430cfff 100644 --- a/tox.ini +++ b/tox.ini @@ -5,8 +5,7 @@ skipsdist = True [testenv] commands = {envbindir}/py.test {posargs} {toxinidir}/tests -deps = -r{toxinidir}/requirements/prod.txt - -r{toxinidir}/requirements/dev.txt +deps = -r{toxinidir}/requirements/dev.txt passenv = PYPI_USERNAME PYPI_PASSWORD recreate = False From 7558e8492da8dc98aa2be39ac30162cbbf71f429 Mon Sep 17 00:00:00 2001 From: naemono Date: Tue, 21 Nov 2017 09:48:14 -0600 Subject: [PATCH 2/2] Adding tests --- objectrocket/util.py | 2 +- tests/test_utils.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 tests/test_utils.py diff --git a/objectrocket/util.py b/objectrocket/util.py index de220e3..79ba352 100644 --- a/objectrocket/util.py +++ b/objectrocket/util.py @@ -86,7 +86,7 @@ def sum_values(value1, value2): elif isinstance(value1, str) or isinstance(value1, datetime.datetime) or isinstance(value1, six.text_type): # noqa return value1 elif isinstance(value1, dict): - keys = set(value1.iterkeys()) | set(value2.iterkeys()) + keys = set(six.iterkeys(value1)) | set(six.iterkeys(value2)) return dict((key, sum_values(value1.get(key), value2.get(key))) for key in keys) else: return value1 + value2 diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..f5a5a4d --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,28 @@ +import pytest +from objectrocket import util + + +@pytest.mark.parametrize("values,expected", + [((None, 1), 1), + ((1, None), 1), + ((1, 1), 2)]) +def test_sum_values_integers(values, expected): + assert util.sum_values(*values) == expected + + +def test_sum_values_fails_different_types(): + with pytest.raises(TypeError) as ex: + util.sum_values(1, 'test') + assert 'are not of the same type' in str(ex) + + +def test_sum_values_succeed_different_number_types(): + assert util.sum_values(1, 2.3) == 3 + + +def test_sum_values_succeeds_list(): + assert util.sum_values([2, 3], [1, 2]) == [1, 2, 3] + + +def test_sum_values_succeeds_dict(): + assert util.sum_values({"one": 1}, {"two": 2}) == {'one': 1, 'two': 2}