Skip to content

Commit 8976ed4

Browse files
authored
Merge pull request #40 from tacaswell/fix_py311
API: drop py27 + support py311 + migrate nose -> pytest + migrate travis -> GHA
2 parents f343ec9 + cb61d0e commit 8976ed4

File tree

10 files changed

+121
-107
lines changed

10 files changed

+121
-107
lines changed

.codecov.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# show coverage in CI status, not as a comment.
2+
comment: off
3+
coverage:
4+
status:
5+
project:
6+
default:
7+
target: auto
8+
patch:
9+
default:
10+
target: auto

.coveragerc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[run]
2+
source =
3+
slicerator
4+
[report]
5+
omit =
6+
*/python?.?/*
7+
*/site-packages/nose/*
8+
# ignore _version.py and versioneer.py
9+
.*version.*
10+
*_version.py
11+
12+
exclude_lines =
13+
if __name__ == '__main__':

.github/workflows/testing.yml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
name: Unit Tests
2+
3+
on:
4+
push:
5+
pull_request:
6+
schedule:
7+
- cron: '00 4 * * *' # daily at 4AM
8+
9+
jobs:
10+
build:
11+
12+
runs-on: ubuntu-latest
13+
strategy:
14+
matrix:
15+
python-version: ['3.7', '3.8', '3.9', '3.10']
16+
fail-fast: false
17+
steps:
18+
19+
- uses: actions/checkout@v2
20+
with:
21+
fetch-depth: 0
22+
23+
- name: Set up Python ${{ matrix.python-version }}
24+
uses: actions/setup-python@v2
25+
with:
26+
python-version: ${{ matrix.python-version }}
27+
28+
- name: Install test requirements
29+
shell: bash -l {0}
30+
run: |
31+
set -vxeuo pipefail
32+
python -m pip install -r requirements-dev.txt
33+
python -m pip install -v .
34+
python -m pip list
35+
36+
- name: Test with pytest
37+
shell: bash -l {0}
38+
run: |
39+
set -vxeuo pipefail
40+
coverage run -m pytest -v
41+
coverage report
42+
43+
- name: Upload code coverage
44+
uses: codecov/codecov-action@v1

.travis.yml

Lines changed: 0 additions & 17 deletions
This file was deleted.

requirements-dev.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# These are required for developing the package (running the tests, building
2+
# the documentation) but not necessarily required for _using_ it.
3+
black
4+
codecov
5+
coverage
6+
flake8
7+
numpy
8+
pytest

run_tests.py

Lines changed: 0 additions & 35 deletions
This file was deleted.

setup.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
packages=['slicerator'],
2121
description='A lazy-loading, fancy-sliceable iterable.',
2222
url='http://github.com/soft-matter/slicerator',
23-
install_requires=['six'],
2423
cmdclass=versioneer.get_cmdclass(),
2524
platforms='Cross platform (Linux, Mac OSX, Windows)',
2625
license="BSD",

slicerator/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import (absolute_import, division, print_function,
22
unicode_literals)
33

4-
from six.moves import range
54
import collections.abc
65
import itertools
76
from functools import wraps

tests.py renamed to tests/test_main.py

Lines changed: 44 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
import numpy as np
66
import random
77
import types
8-
import nose
9-
from six import BytesIO
8+
from io import BytesIO
109
import pickle
11-
from nose.tools import assert_true, assert_false, assert_equal, assert_raises
10+
import pytest
1211
from numpy.testing import assert_array_equal
1312
from slicerator import Slicerator, Pipeline, pipeline, index_attr, propagate_attr
1413

@@ -18,9 +17,9 @@
1817

1918
def assert_letters_equal(actual, expected):
2019
# check if both lengths are equal
21-
assert_equal(len(actual), len(expected))
20+
assert len(actual) == len(expected)
2221
for actual_, expected_ in zip(actual, expected):
23-
assert_equal(actual_, expected_)
22+
assert actual_ == expected_
2423

2524

2625
def compare_slice_to_list(actual, expected):
@@ -134,11 +133,11 @@ def test_slice_with_generator():
134133
compare_slice_to_list(slice1, list('bcdefghij'))
135134
slice2 = slice1[(i for i in range(2, 5))]
136135
assert_letters_equal(list(slice2), list('def'))
137-
assert_true(isinstance(slice2, types.GeneratorType))
136+
assert isinstance(slice2, types.GeneratorType)
138137

139138

140139
def test_no_len_raises():
141-
with assert_raises(ValueError):
140+
with pytest.raises(ValueError):
142141
Slicerator((i for i in range(5)), (i for i in range(5)))
143142

144143
def test_from_func():
@@ -174,8 +173,8 @@ def test_inplace_pipeline():
174173
n_mutable = Slicerator([list([i]) for i in range(10)])
175174
appended = append_zero_inplace(n_mutable)
176175

177-
assert_equal(appended[5], [5, 0]) # execute the function
178-
assert_equal(n_mutable[5], [5]) # check the original
176+
assert appended[5] == [5, 0] # execute the function
177+
assert n_mutable[5] == [5] # check the original
179178

180179

181180
def test_pipeline_simple():
@@ -231,12 +230,12 @@ def close(self):
231230

232231
a = Slicerator(MyList('abcdefghij'), propagate_attrs=['attr1', 's'])
233232
assert_letters_equal(a, list('abcdefghij'))
234-
assert_true(hasattr(a, 'attr1'))
235-
assert_false(hasattr(a, 'attr2'))
236-
assert_true(hasattr(a, 's'))
237-
assert_false(hasattr(a, 'close'))
238-
assert_equal(a.attr1, 'hello')
239-
with assert_raises(AttributeError):
233+
assert hasattr(a, 'attr1')
234+
assert not hasattr(a, 'attr2')
235+
assert hasattr(a, 's')
236+
assert not hasattr(a, 'close')
237+
assert a.attr1 == 'hello'
238+
with pytest.raises(AttributeError):
240239
a[:5].nonexistent_attr
241240

242241
compare_slice_to_list(list(a.s), list('ABCDEFGHIJ'))
@@ -246,12 +245,12 @@ def close(self):
246245
capitalize = pipeline(_capitalize)
247246
b = capitalize(a)
248247
assert_letters_equal(b, list('ABCDEFGHIJ'))
249-
assert_true(hasattr(b, 'attr1'))
250-
assert_false(hasattr(b, 'attr2'))
251-
assert_true(hasattr(b, 's'))
252-
assert_false(hasattr(b, 'close'))
253-
assert_equal(b.attr1, 'hello')
254-
with assert_raises(AttributeError):
248+
assert hasattr(b, 'attr1')
249+
assert not hasattr(b, 'attr2')
250+
assert hasattr(b, 's')
251+
assert not hasattr(b, 'close')
252+
assert b.attr1 == 'hello'
253+
with pytest.raises(AttributeError):
255254
b[:5].nonexistent_attr
256255

257256
compare_slice_to_list(list(b.s), list('ABCDEFGHIJ'))
@@ -299,35 +298,35 @@ def attr4(self):
299298

300299
dummy = Dummy()
301300
subclass = SubClass()
302-
assert_true(hasattr(dummy, 'attr1'))
303-
assert_true(hasattr(dummy, 'attr2'))
304-
assert_true(hasattr(dummy, 'attr3'))
305-
assert_false(hasattr(dummy, 'attr4'))
301+
assert hasattr(dummy, 'attr1')
302+
assert hasattr(dummy, 'attr2')
303+
assert hasattr(dummy, 'attr3')
304+
assert not hasattr(dummy, 'attr4')
306305

307-
assert_true(hasattr(dummy[1:], 'attr1'))
308-
assert_true(hasattr(dummy[1:], 'attr2'))
309-
assert_false(hasattr(dummy[1:], 'attr3'))
310-
assert_false(hasattr(dummy[1:], 'attr4'))
306+
assert hasattr(dummy[1:], 'attr1')
307+
assert hasattr(dummy[1:], 'attr2')
308+
assert not hasattr(dummy[1:], 'attr3')
309+
assert not hasattr(dummy[1:], 'attr4')
311310

312-
assert_true(hasattr(dummy[1:][1:], 'attr1'))
313-
assert_true(hasattr(dummy[1:][1:], 'attr2'))
314-
assert_false(hasattr(dummy[1:][1:], 'attr3'))
315-
assert_false(hasattr(dummy[1:][1:], 'attr4'))
311+
assert hasattr(dummy[1:][1:], 'attr1')
312+
assert hasattr(dummy[1:][1:], 'attr2')
313+
assert not hasattr(dummy[1:][1:], 'attr3')
314+
assert not hasattr(dummy[1:][1:], 'attr4')
316315

317-
assert_true(hasattr(subclass, 'attr1'))
318-
assert_true(hasattr(subclass, 'attr2'))
319-
assert_true(hasattr(subclass, 'attr3'))
320-
assert_true(hasattr(subclass, 'attr4'))
316+
assert hasattr(subclass, 'attr1')
317+
assert hasattr(subclass, 'attr2')
318+
assert hasattr(subclass, 'attr3')
319+
assert hasattr(subclass, 'attr4')
321320

322-
assert_false(hasattr(subclass[1:], 'attr1'))
323-
assert_true(hasattr(subclass[1:], 'attr2'))
324-
assert_false(hasattr(subclass[1:], 'attr3'))
325-
assert_true(hasattr(subclass[1:], 'attr4'))
321+
assert not hasattr(subclass[1:], 'attr1')
322+
assert hasattr(subclass[1:], 'attr2')
323+
assert not hasattr(subclass[1:], 'attr3')
324+
assert hasattr(subclass[1:], 'attr4')
326325

327-
assert_false(hasattr(subclass[1:][1:], 'attr1'))
328-
assert_true(hasattr(subclass[1:][1:], 'attr2'))
329-
assert_false(hasattr(subclass[1:][1:], 'attr3'))
330-
assert_true(hasattr(subclass[1:][1:], 'attr4'))
326+
assert not hasattr(subclass[1:][1:], 'attr1')
327+
assert hasattr(subclass[1:][1:], 'attr2')
328+
assert not hasattr(subclass[1:][1:], 'attr3')
329+
assert hasattr(subclass[1:][1:], 'attr4')
331330

332331

333332
def test_pipeline_with_args():
@@ -552,8 +551,3 @@ def test_pipeline_propagate_attrs():
552551
pass
553552
else:
554553
raise AssertionError("attr2 should not exist")
555-
556-
557-
if __name__ == '__main__':
558-
nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],
559-
exit=False)

versioneer.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,8 @@ def get_config_from_root(root):
339339
# configparser.NoOptionError (if it lacks "VCS="). See the docstring at
340340
# the top of versioneer.py for instructions on writing your setup.cfg .
341341
setup_cfg = os.path.join(root, "setup.cfg")
342-
parser = configparser.SafeConfigParser()
343-
with open(setup_cfg, "r") as f:
344-
parser.readfp(f)
342+
parser = configparser.ConfigParser()
343+
parser.read(setup_cfg)
345344
VCS = parser.get("versioneer", "VCS") # mandatory
346345

347346
def get(parser, name):

0 commit comments

Comments
 (0)