Skip to content

Commit 6bf512b

Browse files
author
Sergey Chipiga
committed
working code
1 parent aa432f0 commit 6bf512b

File tree

13 files changed

+105
-364
lines changed

13 files changed

+105
-364
lines changed

pytest_ordering/__init__.py

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

3-
import re
4-
from collections import defaultdict
3+
__author__ = '[email protected]'
54

6-
replacements = {
5+
import pytest
6+
7+
orders_map = {
78
'first': 0,
89
'second': 1,
910
'third': 2,
@@ -35,72 +36,44 @@ def pytest_configure(config):
3536

3637

3738
def pytest_collection_modifyitems(session, config, items):
38-
items[:] = list(_order_tests(items))
39+
grouped_items = {}
3940

41+
for item in items:
4042

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
43+
for mark_name, order in orders_map.items():
44+
mark = item.get_marker(mark_name)
4945

46+
if mark:
47+
item.add_marker(pytest.mark.run(order=order))
48+
break
5049

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

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']
52+
if mark:
53+
order = mark.kwargs.get('order')
54+
else:
55+
order = None
6056

57+
grouped_items.setdefault(order, []).append(item)
6158

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)
59+
if grouped_items:
60+
unordered_items = grouped_items.pop(None) if None in grouped_items else None
8661

87-
from_beginning, from_end = split(ordered_tests)
88-
remaining_iter = iter(remaining_tests)
62+
sorted_items = []
63+
prev_key = 0
8964

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)
65+
for key, ordered_items in grouped_items.items():
9666

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)
67+
if unordered_items and prev_key >= 0 and key < 0:
68+
69+
sorted_items.extend(unordered_items)
70+
unordered_items = None
71+
72+
prev_key = key
73+
74+
sorted_items.extend(ordered_items)
75+
76+
if unordered_items:
77+
sorted_items.extend(unordered_items)
10478

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

pytest_ordering/_version.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

pytest_ordering/version.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__version__ = '1.0'

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 :: Stable',
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)