Skip to content

Commit 24e00cc

Browse files
committed
Merge pull request #17 from sergeychipiga/feature/working-code
working code
2 parents aa432f0 + 008d9b1 commit 24e00cc

File tree

13 files changed

+224
-358
lines changed

13 files changed

+224
-358
lines changed

pytest_ordering/__init__.py

Lines changed: 33 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
from ._version import __version__
1+
# -*- coding: utf-8 -*-
22

3-
import re
4-
from collections import defaultdict
3+
import pytest
54

6-
replacements = {
5+
orders_map = {
76
'first': 0,
87
'second': 1,
98
'third': 2,
@@ -35,72 +34,44 @@ def pytest_configure(config):
3534

3635

3736
def pytest_collection_modifyitems(session, config, items):
38-
items[:] = list(_order_tests(items))
37+
grouped_items = {}
3938

39+
for item in items:
4040

41-
def orderable(marker_name, marker_info):
42-
if not hasattr(marker_info, 'kwargs'):
43-
return False
44-
elif 'order' in marker_info.kwargs:
45-
return True
46-
else:
47-
match = re.match('^order(\d+)$', marker_name)
48-
return bool(match) or marker_name in replacements
41+
for mark_name, order in orders_map.items():
42+
mark = item.get_marker(mark_name)
4943

44+
if mark:
45+
item.add_marker(pytest.mark.run(order=order))
46+
break
5047

51-
def get_index(marker_name, marker_info):
52-
match = re.match('^order(\d+)$', marker_name)
48+
mark = item.get_marker('run')
5349

54-
if match:
55-
return int(match.group(1)) - 1
56-
elif marker_name in replacements:
57-
return replacements[marker_name]
58-
else:
59-
return marker_info.kwargs['order']
50+
if mark:
51+
order = mark.kwargs.get('order')
52+
else:
53+
order = None
6054

55+
grouped_items.setdefault(order, []).append(item)
6156

62-
def split(dictionary):
63-
from_beginning, from_end = {}, {}
64-
for key, val in dictionary.items():
65-
if key >= 0:
66-
from_beginning[key] = val
67-
else:
68-
from_end[key] = val
69-
return from_beginning, from_end
70-
71-
72-
def _order_tests(tests):
73-
ordered_tests = defaultdict(list)
74-
remaining_tests = []
75-
76-
for test in tests:
77-
# There has got to be an API for this. :-/
78-
markers = test.keywords.__dict__['_markers']
79-
orderable_markers = [(k, v) for (k, v) in markers.items()
80-
if orderable(k, v)]
81-
if len(orderable_markers) == 1:
82-
marker_name, marker_info = orderable_markers[0]
83-
ordered_tests[get_index(marker_name, marker_info)].append(test)
84-
else:
85-
remaining_tests.append(test)
57+
if grouped_items:
58+
unordered_items = grouped_items.pop(None, None)
8659

87-
from_beginning, from_end = split(ordered_tests)
88-
remaining_iter = iter(remaining_tests)
60+
sorted_items = []
61+
prev_key = 0
8962

90-
for i in range(max(from_beginning or [-1]) + 1):
91-
if i in from_beginning:
92-
for test in from_beginning[i]:
93-
yield test
94-
else:
95-
yield next(remaining_iter)
63+
for key, ordered_items in grouped_items.items():
9664

97-
# TODO TODO TODO
98-
for i in range(min(from_end or [0]), 0):
99-
if i in from_end:
100-
for test in from_end[i]:
101-
yield test
102-
else:
103-
yield next(remaining_iter)
65+
if unordered_items and prev_key >= 0 and key < 0:
66+
67+
sorted_items.extend(unordered_items)
68+
unordered_items = None
69+
70+
prev_key = key
71+
72+
sorted_items.extend(ordered_items)
73+
74+
if unordered_items:
75+
sorted_items.extend(unordered_items)
10476

105-
for test in remaining_iter:
106-
yield test
77+
items[:] = sorted_items

pytest_ordering/author.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
__author__ = '[email protected] <Frank Tobia>, ' \
2+
'[email protected] <Sergei Chipiga>'
File renamed without changes.

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# define __version__
99
# execfile doesn't exist in python 3
1010
# see: http://stackoverflow.com/questions/6357361/alternative-to-execfile-in-python-3-2
11-
exec(open(os.path.join(__here__, 'pytest_ordering', '_version.py')).read())
11+
exec(open(os.path.join(__here__, 'pytest_ordering', 'version.py')).read())
1212

1313

1414
setup(
@@ -26,7 +26,7 @@
2626
},
2727
install_requires=['pytest'],
2828
classifiers=[
29-
'Development Status :: 3 - Alpha',
29+
'Development Status :: 4 - Beta',
3030
'Intended Audience :: Developers',
3131
'License :: OSI Approved :: MIT License',
3232
'Operating System :: POSIX',

tests/__init__.py

Whitespace-only changes.

tests/conftest.py

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

tests/grouping.py

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

tests/marked_classes.py

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

tests/numbers.py

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

0 commit comments

Comments
 (0)