diff --git a/.travis.yml b/.travis.yml
index acde10e..9b41696 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,14 +6,16 @@ matrix:
- python: 3.4
- python: 3.5
- python: 3.6
+ - python: 3.7
- python: "nightly"
env: PRE=--pre
allow_failures:
- python : "nightly"
install:
- - python setup.py install
- - pip install pytest pytest-cov coverage
+ - python -m pip install --upgrade pip
+ - python -m pip install -v .
+ - python -m pip install $PRE --upgrade pytest pytest-cov coverage
script:
- coverage run run_tests.py
diff --git a/cycler.py b/cycler.py
index 3b05dc1..f6245c1 100644
--- a/cycler.py
+++ b/cycler.py
@@ -324,6 +324,11 @@ def __eq__(self, other):
return all(a == b for a, b in zip(self, other))
+ def __ne__(self, other):
+ return not (self == other)
+
+ __hash__ = None
+
def __repr__(self):
op_map = {zip: '+', product: '*'}
if self._right is None:
diff --git a/test_cycler.py b/test_cycler.py
index 50c17f0..ded15c0 100644
--- a/test_cycler.py
+++ b/test_cycler.py
@@ -26,73 +26,84 @@ def _cycler_helper(c, length, keys, values):
def _cycles_equal(c1, c2):
assert list(c1) == list(c2)
+ assert c1 == c2
-def test_creation():
- c = cycler(c='rgb')
- yield _cycler_helper, c, 3, ['c'], [['r', 'g', 'b']]
- c = cycler(c=list('rgb'))
- yield _cycler_helper, c, 3, ['c'], [['r', 'g', 'b']]
- c = cycler(cycler(c='rgb'))
- yield _cycler_helper, c, 3, ['c'], [['r', 'g', 'b']]
+@pytest.mark.parametrize('c', [cycler(c='rgb'),
+ cycler(c=list('rgb')),
+ cycler(cycler(c='rgb'))],
+ ids=['from string',
+ 'from list',
+ 'from cycler'])
+def test_creation(c):
+ _cycler_helper(c, 3, ['c'], [['r', 'g', 'b']])
-def test_compose():
+def test_add():
c1 = cycler(c='rgb')
c2 = cycler(lw=range(3))
- c3 = cycler(lw=range(15))
# addition
- yield _cycler_helper, c1+c2, 3, ['c', 'lw'], [list('rgb'), range(3)]
- yield _cycler_helper, c2+c1, 3, ['c', 'lw'], [list('rgb'), range(3)]
- yield _cycles_equal, c2+c1, c1+c2
+ _cycler_helper(c1+c2, 3, ['c', 'lw'], [list('rgb'), range(3)])
+ _cycler_helper(c2+c1, 3, ['c', 'lw'], [list('rgb'), range(3)])
+ _cycles_equal(c2+c1, c1+c2)
+
+
+def test_add_len_mismatch():
# miss-matched add lengths
+ c1 = cycler(c='rgb')
+ c3 = cycler(lw=range(15))
with pytest.raises(ValueError):
c1 + c3
with pytest.raises(ValueError):
c3 + c1
+
+def test_prod():
+ c1 = cycler(c='rgb')
+ c2 = cycler(lw=range(3))
+ c3 = cycler(lw=range(15))
# multiplication
target = zip(*product(list('rgb'), range(3)))
- yield (_cycler_helper, c1 * c2, 9, ['c', 'lw'], target)
+ _cycler_helper(c1 * c2, 9, ['c', 'lw'], target)
target = zip(*product(range(3), list('rgb')))
- yield (_cycler_helper, c2 * c1, 9, ['lw', 'c'], target)
+ _cycler_helper(c2 * c1, 9, ['lw', 'c'], target)
target = zip(*product(range(15), list('rgb')))
- yield (_cycler_helper, c3 * c1, 45, ['lw', 'c'], target)
+ _cycler_helper(c3 * c1, 45, ['lw', 'c'], target)
def test_inplace():
c1 = cycler(c='rgb')
c2 = cycler(lw=range(3))
c2 += c1
- yield _cycler_helper, c2, 3, ['c', 'lw'], [list('rgb'), range(3)]
+ _cycler_helper(c2, 3, ['c', 'lw'], [list('rgb'), range(3)])
c3 = cycler(c='rgb')
c4 = cycler(lw=range(3))
c3 *= c4
target = zip(*product(list('rgb'), range(3)))
- yield (_cycler_helper, c3, 9, ['c', 'lw'], target)
+ _cycler_helper(c3, 9, ['c', 'lw'], target)
def test_constructor():
c1 = cycler(c='rgb')
c2 = cycler(ec=c1)
- yield _cycler_helper, c1+c2, 3, ['c', 'ec'], [['r', 'g', 'b']]*2
+ _cycler_helper(c1+c2, 3, ['c', 'ec'], [['r', 'g', 'b']]*2)
c3 = cycler(c=c1)
- yield _cycler_helper, c3+c2, 3, ['c', 'ec'], [['r', 'g', 'b']]*2
+ _cycler_helper(c3+c2, 3, ['c', 'ec'], [['r', 'g', 'b']]*2)
# Using a non-string hashable
c4 = cycler(1, range(3))
- yield _cycler_helper, c4+c1, 3, [1, 'c'], [range(3), ['r', 'g', 'b']]
+ _cycler_helper(c4+c1, 3, [1, 'c'], [range(3), ['r', 'g', 'b']])
# addition using cycler()
- yield (_cycler_helper, cycler(c='rgb', lw=range(3)),
- 3, ['c', 'lw'], [list('rgb'), range(3)])
- yield (_cycler_helper, cycler(lw=range(3), c='rgb'),
- 3, ['c', 'lw'], [list('rgb'), range(3)])
+ _cycler_helper(cycler(c='rgb', lw=range(3)),
+ 3, ['c', 'lw'], [list('rgb'), range(3)])
+ _cycler_helper(cycler(lw=range(3), c='rgb'),
+ 3, ['c', 'lw'], [list('rgb'), range(3)])
# Purposely mixing them
- yield (_cycler_helper, cycler(c=range(3), lw=c1),
- 3, ['c', 'lw'], [range(3), list('rgb')])
+ _cycler_helper(cycler(c=range(3), lw=c1),
+ 3, ['c', 'lw'], [range(3), list('rgb')])
def test_failures():
@@ -114,24 +125,24 @@ def test_simplify():
c1 = cycler(c='rgb')
c2 = cycler(ec=c1)
for c in [c1 * c2, c2 * c1, c1 + c2]:
- yield _cycles_equal, c, c.simplify()
+ _cycles_equal(c, c.simplify())
def test_multiply():
c1 = cycler(c='rgb')
- yield _cycler_helper, 2*c1, 6, ['c'], ['rgb'*2]
+ _cycler_helper(2*c1, 6, ['c'], ['rgb'*2])
c2 = cycler(ec=c1)
c3 = c1 * c2
- yield _cycles_equal, 2*c3, c3*2
+ _cycles_equal(2*c3, c3*2)
def test_mul_fails():
c1 = cycler(c='rgb')
- pytest.raises(TypeError, mul, c1, 2.0)
- pytest.raises(TypeError, mul, c1, 'a')
- pytest.raises(TypeError, mul, c1, [])
+ pytest.raises(TypeError, mul, c1, 2.0)
+ pytest.raises(TypeError, mul, c1, 'a')
+ pytest.raises(TypeError, mul, c1, [])
def test_getitem():
@@ -141,7 +152,7 @@ def test_getitem():
slice(None, None, -1),
slice(1, 5, None),
slice(0, 5, 2)):
- yield _cycles_equal, c1[slc], cycler(3, widths[slc])
+ _cycles_equal(c1[slc], cycler(3, widths[slc]))
def test_fail_getime():
@@ -164,14 +175,14 @@ def test_repr():
c_sum_rpr = "(cycler('c', ['r', 'g', 'b']) + cycler('3rd', [0, 1, 2]))"
c_prod_rpr = "(cycler('c', ['r', 'g', 'b']) * cycler('3rd', [0, 1, 2]))"
- yield _repr_tester_helper, '__repr__', c + c2, c_sum_rpr
- yield _repr_tester_helper, '__repr__', c * c2, c_prod_rpr
+ _repr_tester_helper('__repr__', c + c2, c_sum_rpr)
+ _repr_tester_helper('__repr__', c * c2, c_prod_rpr)
sum_html = "
"
prod_html = "| '3rd' | 'c' | | 0 | 'r' |
| 1 | 'r' |
| 2 | 'r' |
| 0 | 'g' |
| 1 | 'g' |
| 2 | 'g' |
| 0 | 'b' |
| 1 | 'b' |
| 2 | 'b' |
"
- yield _repr_tester_helper, '_repr_html_', c + c2, sum_html
- yield _repr_tester_helper, '_repr_html_', c * c2, prod_html
+ _repr_tester_helper('_repr_html_', c + c2, sum_html)
+ _repr_tester_helper('_repr_html_', c * c2, prod_html)
def test_call():
@@ -264,17 +275,17 @@ def _eq_test_helper(a, b, res):
def test_eq():
a = cycler(c='rgb')
b = cycler(c='rgb')
- yield _eq_test_helper, a, b, True
- yield _eq_test_helper, a, b[::-1], False
+ _eq_test_helper(a, b, True)
+ _eq_test_helper(a, b[::-1], False)
c = cycler(lw=range(3))
- yield _eq_test_helper, a+c, c+a, True
- yield _eq_test_helper, a+c, c+b, True
- yield _eq_test_helper, a*c, c*a, False
- yield _eq_test_helper, a, c, False
+ _eq_test_helper(a+c, c+a, True)
+ _eq_test_helper(a+c, c+b, True)
+ _eq_test_helper(a*c, c*a, False)
+ _eq_test_helper(a, c, False)
d = cycler(c='ymk')
- yield _eq_test_helper, b, d, False
+ _eq_test_helper(b, d, False)
e = cycler(c='orange')
- yield _eq_test_helper, b, e, False
+ _eq_test_helper(b, e, False)
def test_cycler_exceptions():
@@ -323,7 +334,7 @@ def test_by_key_add():
cy = cycler(c=input_dict['c']) + cycler(lw=input_dict['lw'])
res = cy.by_key()
assert res == input_dict
- yield _by_key_helper, cy
+ _by_key_helper(cy)
def test_by_key_mul():
@@ -331,7 +342,7 @@ def test_by_key_mul():
cy = cycler(c=input_dict['c']) * cycler(lw=input_dict['lw'])
res = cy.by_key()
assert input_dict['lw'] * len(input_dict['c']) == res['lw']
- yield _by_key_helper, cy
+ _by_key_helper(cy)
def test_contains():