From ef37e29f1b672894caa477382c3ca121d3efbf98 Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 16:54:42 +0200 Subject: [PATCH 01/13] Some example test files for plaing around --- AUTHORS | 1 + pytest_ordering/_version.py | 2 +- setup.py | 2 ++ tests/test.py | 5 +++++ tests/test_number.py | 17 +++++++++++++++++ tests/test_ordinals.py | 17 +++++++++++++++++ tests/test_other.py | 17 +++++++++++++++++ tests/test_quickstart.py | 9 +++++++++ tests/test_relative.py | 12 ++++++++++++ 9 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 tests/test.py create mode 100644 tests/test_number.py create mode 100644 tests/test_ordinals.py create mode 100644 tests/test_other.py create mode 100644 tests/test_quickstart.py create mode 100644 tests/test_relative.py diff --git a/AUTHORS b/AUTHORS index 78f7d6c..75ab56a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,3 +1,4 @@ Frank Tobia Sergei Chipiga Ben Greene +Jonas Zinn diff --git a/pytest_ordering/_version.py b/pytest_ordering/_version.py index 5a6f84c..27fda16 100644 --- a/pytest_ordering/_version.py +++ b/pytest_ordering/_version.py @@ -1 +1 @@ -__version__ = '0.5' +__version__ = '0.6' diff --git a/setup.py b/setup.py index fa080b0..3662d94 100644 --- a/setup.py +++ b/setup.py @@ -42,6 +42,8 @@ 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: Implementation :: PyPy', ], ) diff --git a/tests/test.py b/tests/test.py new file mode 100644 index 0000000..14b1107 --- /dev/null +++ b/tests/test.py @@ -0,0 +1,5 @@ +def test_foo(): + assert True + +def test_bar(): + assert True \ No newline at end of file diff --git a/tests/test_number.py b/tests/test_number.py new file mode 100644 index 0000000..be76d1a --- /dev/null +++ b/tests/test_number.py @@ -0,0 +1,17 @@ +import pytest + +@pytest.mark.run(order=-2) +def test_three(): + assert True + +@pytest.mark.run(order=-1) +def test_four(): + assert True + +@pytest.mark.run(order=2) +def test_two(): + assert True + +@pytest.mark.run(order=1) +def test_one(): + assert True \ No newline at end of file diff --git a/tests/test_ordinals.py b/tests/test_ordinals.py new file mode 100644 index 0000000..7e1005e --- /dev/null +++ b/tests/test_ordinals.py @@ -0,0 +1,17 @@ +import pytest + +@pytest.mark.run('second_to_last') +def test_three(): + assert True + +@pytest.mark.run('last') +def test_four(): + assert True + +@pytest.mark.run('second') +def test_two(): + assert True + +@pytest.mark.run('first') +def test_one(): + assert True \ No newline at end of file diff --git a/tests/test_other.py b/tests/test_other.py new file mode 100644 index 0000000..390b9e0 --- /dev/null +++ b/tests/test_other.py @@ -0,0 +1,17 @@ +import pytest + +@pytest.mark.second_to_last +def test_three(): + assert True + +@pytest.mark.last +def test_four(): + assert True + +@pytest.mark.second +def test_two(): + assert True + +@pytest.mark.first +def test_one(): + assert True \ No newline at end of file diff --git a/tests/test_quickstart.py b/tests/test_quickstart.py new file mode 100644 index 0000000..706d53f --- /dev/null +++ b/tests/test_quickstart.py @@ -0,0 +1,9 @@ +import pytest + +@pytest.mark.order2 +def test_foo(): + assert True + +@pytest.mark.order1 +def test_bar(): + assert True \ No newline at end of file diff --git a/tests/test_relative.py b/tests/test_relative.py new file mode 100644 index 0000000..517ce06 --- /dev/null +++ b/tests/test_relative.py @@ -0,0 +1,12 @@ +import pytest + +@pytest.mark.run(after='test_second') +def test_third(): + assert True + +def test_second(): + assert True + +@pytest.mark.run(before='test_second') +def test_first(): + assert True \ No newline at end of file From 779734af571cf48e593a5413dfec8b7a286e1352 Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 16:56:46 +0200 Subject: [PATCH 02/13] move test files to example folder --- {tests => example}/test.py | 0 {tests => example}/test_number.py | 0 {tests => example}/test_ordinals.py | 0 {tests => example}/test_other.py | 0 {tests => example}/test_quickstart.py | 0 {tests => example}/test_relative.py | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {tests => example}/test.py (100%) rename {tests => example}/test_number.py (100%) rename {tests => example}/test_ordinals.py (100%) rename {tests => example}/test_other.py (100%) rename {tests => example}/test_quickstart.py (100%) rename {tests => example}/test_relative.py (100%) diff --git a/tests/test.py b/example/test.py similarity index 100% rename from tests/test.py rename to example/test.py diff --git a/tests/test_number.py b/example/test_number.py similarity index 100% rename from tests/test_number.py rename to example/test_number.py diff --git a/tests/test_ordinals.py b/example/test_ordinals.py similarity index 100% rename from tests/test_ordinals.py rename to example/test_ordinals.py diff --git a/tests/test_other.py b/example/test_other.py similarity index 100% rename from tests/test_other.py rename to example/test_other.py diff --git a/tests/test_quickstart.py b/example/test_quickstart.py similarity index 100% rename from tests/test_quickstart.py rename to example/test_quickstart.py diff --git a/tests/test_relative.py b/example/test_relative.py similarity index 100% rename from tests/test_relative.py rename to example/test_relative.py From 8bc1196f68265b9721a11b9598e398e29177d97d Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 17:06:03 +0200 Subject: [PATCH 03/13] First version supporting multipe markers. The markers mentiond here http://pytest-ordering.readthedocs.io/en/develop/ should work. --- pytest_ordering/__init__.py | 156 +++++++++++++++++++++++++++++------- pytest_ordering/_version.py | 2 +- 2 files changed, 126 insertions(+), 32 deletions(-) diff --git a/pytest_ordering/__init__.py b/pytest_ordering/__init__.py index 6832144..8e1eda5 100644 --- a/pytest_ordering/__init__.py +++ b/pytest_ordering/__init__.py @@ -2,8 +2,11 @@ from ._version import __version__ import operator - +import re import pytest +from collections import OrderedDict +import os +import sys orders_map = { 'first': 0, @@ -21,7 +24,7 @@ 'fifth_to_last': -5, 'sixth_to_last': -6, 'seventh_to_last': -7, - 'eighth_to_last': -8, + 'eighth_to_last': -8 } @@ -36,37 +39,128 @@ def pytest_configure(config): config.addinivalue_line('markers', config_line) -def pytest_collection_modifyitems(session, config, items): - grouped_items = {} - - for item in items: - - for mark_name, order in orders_map.items(): - mark = item.get_marker(mark_name) - - if mark: - item.add_marker(pytest.mark.run(order=order)) - break - +def mark_binning(item, keys, start, end, before, after, unordered): + match_order = re.compile(r"order(\d+)(:?,|$)") + find_order = match_order.search(",".join(keys)) + if find_order: + order = int(find_order.group(1)) + if order < 0: + end.setdefault(order, []).append(item) + else: + start.setdefault(order, []).append(item) + return True + elif "run" in keys: mark = item.get_marker('run') - - if mark: - order = mark.kwargs.get('order') + order = mark.kwargs.get('order') + before_mark = mark.kwargs.get('before') + after_mark = mark.kwargs.get('after') + if order: + order = int(order) + if order < 0: + end.setdefault(order, []).append(item) + else: + start.setdefault(order, []).append(item) + elif before_mark: + if "." not in before_mark: + before_mark = item.location[0].rsplit(os.sep, 1)[1][:-3] + "." + before_mark + before.setdefault(before_mark, []).append(item) + elif after_mark: + if "." not in after_mark: + after_mark = item.location[0].rsplit(os.sep, 1)[1][:-3] + "." + after_mark + after.setdefault(after_mark, []).append(item) else: - order = None - - grouped_items.setdefault(order, []).append(item) - - sorted_items = [] - unordered_items = [grouped_items.pop(None, [])] + for ordinal, position in orders_map.items(): + if ordinal in mark.args: + if position < 0: + end.setdefault(position, []).append(item) + else: + start.setdefault(position, []).append(item) + break + return True + for mark_name, order in orders_map.items(): + mark = item.get_marker(mark_name) + if mark: + order = int(order) + if order < 0: + end.setdefault(order, []).append(item) + else: + start.setdefault(order, []).append(item) + return True + unordered.append(item) + return False + +def insert(items, sort): + list_items = [] + if isinstance(items, dict): + for key, values in items.items(): + list_items += values + elif isinstance(items, tuple): + list_items = items[1] + else: + list_items = items + sort += list_items + +def insert_before( name, items, sort): + regex_name = re.escape(name) + r"(:?\.\w+)?$" + for pos, item in enumerate(sort): + item_name = item.location[0].rsplit(os.sep, 1)[1][:-3] + "." + item.location[2] + if re.match(regex_name, item_name): + sort[pos:1] = items + return True + return False + +def insert_after(name, items, sort): + regex_name = re.escape(name) + r"(:?\.\w+)?$" + for pos, item in reversed(list(enumerate(sort))): + item_name = item.location[0].rsplit(os.sep, 1)[1][:-3] + "." + item.location[2] + if re.match(regex_name, item_name): + sort[pos+1:1] = items + return True + + return False - start_list = sorted((i for i in grouped_items.items() if i[0] >= 0), - key=operator.itemgetter(0)) - end_list = sorted((i for i in grouped_items.items() if i[0] < 0), - key=operator.itemgetter(0)) +def pytest_collection_modifyitems(session, config, items): + before_item = {} + after_item = {} + start_item = {} + end_item = {} + unordered_list = [] - sorted_items.extend([i[1] for i in start_list]) - sorted_items.extend(unordered_items) - sorted_items.extend([i[1] for i in end_list]) + for item in items: + mark_binning(item, item.keywords.keys(), start_item, end_item, before_item, after_item, unordered_list) + + start_item = sorted(start_item.items()) + end_item = sorted(end_item.items()) + + sorted_list = [] + + for entries in start_item: + insert(entries, sorted_list) + insert(unordered_list, sorted_list) + for entries in end_item: + insert(entries, sorted_list) + + still_left = 0 + length = len(before_item) + len(after_item) + + while( still_left != length): + still_left = length + remove_labels = [] + for label, before in before_item.items(): + if insert_before(label, before, sorted_list): + remove_labels.append(label) + for label in remove_labels: + del before_item[remove_labels] + + remove_labels = [] + for label, after in after_item.items(): + if insert_after(label, after, sorted_list): + remove_labels.append(label) + for label in remove_labels: + del after_item[label] + + length = len(before_item) + len(after_item) + index = 1 + print() + items[:] = sorted_list - items[:] = [item for sublist in sorted_items for item in sublist] diff --git a/pytest_ordering/_version.py b/pytest_ordering/_version.py index 27fda16..7e49527 100644 --- a/pytest_ordering/_version.py +++ b/pytest_ordering/_version.py @@ -1 +1 @@ -__version__ = '0.6' +__version__ = '1.0' From 97509ef96e1cb2bc555b74c6a7622e136eacf08d Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 17:30:49 +0200 Subject: [PATCH 04/13] also tread 0 as valid number for run(order) --- pytest_ordering/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pytest_ordering/__init__.py b/pytest_ordering/__init__.py index 8e1eda5..4ca29d0 100644 --- a/pytest_ordering/__init__.py +++ b/pytest_ordering/__init__.py @@ -54,7 +54,7 @@ def mark_binning(item, keys, start, end, before, after, unordered): order = mark.kwargs.get('order') before_mark = mark.kwargs.get('before') after_mark = mark.kwargs.get('after') - if order: + if order is not None: order = int(order) if order < 0: end.setdefault(order, []).append(item) @@ -160,7 +160,6 @@ def pytest_collection_modifyitems(session, config, items): del after_item[label] length = len(before_item) + len(after_item) - index = 1 - print() + items[:] = sorted_list From c1a3e71d6d79631d7fec943f61557fc6f5c769e8 Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 17:40:45 +0200 Subject: [PATCH 05/13] new test cases for coverage --- tests/test_ordering.py | 67 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/tests/test_ordering.py b/tests/test_ordering.py index 12f4689..69878ac 100644 --- a/tests/test_ordering.py +++ b/tests/test_ordering.py @@ -267,8 +267,75 @@ def test_5(self): pass assert item_names_for(tests_content) == ['test_3', 'test_4', 'test_5', 'test_1', 'test_2'] +def test_run_ordinals(item_names_for): + test_content=""" + import pytest + + @pytest.mark.run('second-to-last') + def test_three(): + pass + + @pytest.mark.run('last') + def test_four(): + pass + + @pytest.mark.run('second') + def test_two(): + pass + + @pytest.mark.run('first') + def test_one(): + pass + """ + + assert item_names_for(test_content) == ['test_one', 'test_two', 'test_three', 'test_four'] + +def test_quickstart(item_names_for): + test_content=""" + import pytest + + def test_foo(): + pass + + def test_bar(): + pass + """ + assert item_names_for(test_content) == ['test_foo', 'test_bar'] + +def test_quickstart2(item_names_for): + test_content=""" + import pytest + + @pytest.mark.order2 + def test_foo(): + pass + + @pytest.mark.order1 + def test_bar(): + pass + """ + assert item_names_for(test_content) == ['test_bar', 'test_foo'] + +def test_relative(item_names_for): + test_content=""" + import pytest + + @pytest.mark.run(after='test_second') + def test_third(): + pass + + def test_second(): + pass + + @pytest.mark.run(before='test_second') + def test_first(): + pass + """ + assert item_names_for(test_content) == ['test_first', 'test_second', 'test_third'] + def test_run_marker_registered(capsys): pytest.main('--markers') out, err = capsys.readouterr() assert '@pytest.mark.run' in out + From edb50fa6c9676c58d1ccf15f17b554dfab44f1a9 Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 17:42:58 +0200 Subject: [PATCH 06/13] copied typo from hp --- tests/test_ordering.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_ordering.py b/tests/test_ordering.py index 69878ac..073d9ab 100644 --- a/tests/test_ordering.py +++ b/tests/test_ordering.py @@ -271,7 +271,7 @@ def test_run_ordinals(item_names_for): test_content=""" import pytest - @pytest.mark.run('second-to-last') + @pytest.mark.run('second_to_last') def test_three(): pass From 7ca473644707ce20cd519063ab10e1ac3239781c Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 18:41:23 +0200 Subject: [PATCH 07/13] fixed some border cases --- pytest_ordering/__init__.py | 48 ++++++++++++++++++-------- tests/test_ordering.py | 67 +++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 14 deletions(-) diff --git a/pytest_ordering/__init__.py b/pytest_ordering/__init__.py index 4ca29d0..d156000 100644 --- a/pytest_ordering/__init__.py +++ b/pytest_ordering/__init__.py @@ -44,10 +44,7 @@ def mark_binning(item, keys, start, end, before, after, unordered): find_order = match_order.search(",".join(keys)) if find_order: order = int(find_order.group(1)) - if order < 0: - end.setdefault(order, []).append(item) - else: - start.setdefault(order, []).append(item) + start.setdefault(order, []).append(item) return True elif "run" in keys: mark = item.get_marker('run') @@ -62,11 +59,18 @@ def mark_binning(item, keys, start, end, before, after, unordered): start.setdefault(order, []).append(item) elif before_mark: if "." not in before_mark: - before_mark = item.location[0].rsplit(os.sep, 1)[1][:-3] + "." + before_mark + prefix = item.location[0] + if os.sep in prefix: + prefix = prefix.rsplit(os.sep, 1)[1] + before_mark = prefix[:-3] + "." + before_mark before.setdefault(before_mark, []).append(item) elif after_mark: if "." not in after_mark: - after_mark = item.location[0].rsplit(os.sep, 1)[1][:-3] + "." + after_mark + prefix = item.location[0] + if os.sep in prefix: + prefix = prefix.rsplit(os.sep, 1)[1] + after_mark = prefix[:-3] + "." + after_mark + after.setdefault(after_mark, []).append(item) else: for ordinal, position in orders_map.items(): @@ -91,10 +95,7 @@ def mark_binning(item, keys, start, end, before, after, unordered): def insert(items, sort): list_items = [] - if isinstance(items, dict): - for key, values in items.items(): - list_items += values - elif isinstance(items, tuple): + if isinstance(items, tuple): list_items = items[1] else: list_items = items @@ -103,16 +104,25 @@ def insert(items, sort): def insert_before( name, items, sort): regex_name = re.escape(name) + r"(:?\.\w+)?$" for pos, item in enumerate(sort): - item_name = item.location[0].rsplit(os.sep, 1)[1][:-3] + "." + item.location[2] + prefix = item.location[0] + if os.sep in prefix: + prefix = item.location[0].rsplit(os.sep, 1)[1] + item_name = prefix[:-3] + "." + item.location[2] if re.match(regex_name, item_name): - sort[pos:1] = items + if pos == 0: + sort[:] = items + sort + else: + sort[pos:1] = items return True return False def insert_after(name, items, sort): regex_name = re.escape(name) + r"(:?\.\w+)?$" for pos, item in reversed(list(enumerate(sort))): - item_name = item.location[0].rsplit(os.sep, 1)[1][:-3] + "." + item.location[2] + prefix = item.location[0] + if os.sep in prefix: + prefix = item.location[0].rsplit(os.sep, 1)[1] + item_name = prefix[:-3] + "." + item.location[2] if re.match(regex_name, item_name): sort[pos+1:1] = items return True @@ -150,7 +160,7 @@ def pytest_collection_modifyitems(session, config, items): if insert_before(label, before, sorted_list): remove_labels.append(label) for label in remove_labels: - del before_item[remove_labels] + del before_item[label] remove_labels = [] for label, after in after_item.items(): @@ -160,6 +170,16 @@ def pytest_collection_modifyitems(session, config, items): del after_item[label] length = len(before_item) + len(after_item) + if length: + sys.stdout.write("WARNING: can not execute test relative to others: ") + for label, entry in before_item: + sys.stdout.write( label + " ") + sorted_list += entry + for label, entry in end_item: + sys.stdout.write( label + " ") + sorted_list += entry + sys.flush() + print("enqueue them behind the others") items[:] = sorted_list diff --git a/tests/test_ordering.py b/tests/test_ordering.py index 073d9ab..10ee816 100644 --- a/tests/test_ordering.py +++ b/tests/test_ordering.py @@ -334,6 +334,73 @@ def test_first(): assert item_names_for(test_content) == ['test_first', 'test_second', 'test_third'] +def test_relative2(item_names_for): + test_content=""" + import pytest + + @pytest.mark.run(after='test_second') + def test_third(): + pass + + def test_second(): + pass + + @pytest.mark.run(before='test_second') + def test_first(): + pass + + def test_five(): + pass + + @pytest.mark.run(before='test_five') + def test_four(): + pass + + """ + assert item_names_for(test_content) == ['test_first', 'test_second', 'test_third', 'test_four', 'test_five'] + +def test_relative3(item_names_for): + test_content=""" + import pytest + + @pytest.mark.run(after='test_second') + def test_third(): + pass + + def test_second(): + pass + + @pytest.mark.run(before='test_second') + def test_first(): + pass + + def test_five(): + pass + + @pytest.mark.run(before='test_five') + def test_four(): + pass + + """ + assert item_names_for(test_content) == ['test_first', 'test_second', 'test_third', 'test_four', 'test_five'] + +def test_false_insert(item_names_for): + test_content=""" + import pytest + + @pytest.mark.run(after='test_a') + def test_third(): + pass + + def test_second(): + pass + + @pytest.mark.run(before='test_b') + def test_first(): + pass + """ + assert item_names_for(test_content) == ['test_first', 'test_second', 'test_third', 'test_four', 'test_five'] + def test_run_marker_registered(capsys): pytest.main('--markers') out, err = capsys.readouterr() From f0a15c074c28d2dcd006d4e5ee3bf8b85596819e Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 18:42:19 +0200 Subject: [PATCH 08/13] fixed some border cases --- pytest_ordering/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytest_ordering/__init__.py b/pytest_ordering/__init__.py index d156000..38c66b3 100644 --- a/pytest_ordering/__init__.py +++ b/pytest_ordering/__init__.py @@ -172,10 +172,10 @@ def pytest_collection_modifyitems(session, config, items): length = len(before_item) + len(after_item) if length: sys.stdout.write("WARNING: can not execute test relative to others: ") - for label, entry in before_item: + for label, entry in before_item.items(): sys.stdout.write( label + " ") sorted_list += entry - for label, entry in end_item: + for label, entry in end_item.items(): sys.stdout.write( label + " ") sorted_list += entry sys.flush() From 952810d86ab1fa65d7ff041993de09ee9cd8cc1c Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 18:43:01 +0200 Subject: [PATCH 09/13] fixed some border cases --- pytest_ordering/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytest_ordering/__init__.py b/pytest_ordering/__init__.py index 38c66b3..c3eea66 100644 --- a/pytest_ordering/__init__.py +++ b/pytest_ordering/__init__.py @@ -175,7 +175,7 @@ def pytest_collection_modifyitems(session, config, items): for label, entry in before_item.items(): sys.stdout.write( label + " ") sorted_list += entry - for label, entry in end_item.items(): + for label, entry in after_item.items(): sys.stdout.write( label + " ") sorted_list += entry sys.flush() From 1f00c663670e308c7086048455ec0a356373ed6f Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 18:43:20 +0200 Subject: [PATCH 10/13] fixed some border cases --- pytest_ordering/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytest_ordering/__init__.py b/pytest_ordering/__init__.py index c3eea66..8d0ddac 100644 --- a/pytest_ordering/__init__.py +++ b/pytest_ordering/__init__.py @@ -178,7 +178,7 @@ def pytest_collection_modifyitems(session, config, items): for label, entry in after_item.items(): sys.stdout.write( label + " ") sorted_list += entry - sys.flush() + sys.stdout.flush() print("enqueue them behind the others") items[:] = sorted_list From cba1bcee06b743a3eadf5a3f5da441fabb60228e Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Thu, 30 Mar 2017 18:44:27 +0200 Subject: [PATCH 11/13] get the order right --- tests/test_ordering.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_ordering.py b/tests/test_ordering.py index 10ee816..2a45839 100644 --- a/tests/test_ordering.py +++ b/tests/test_ordering.py @@ -399,7 +399,7 @@ def test_second(): def test_first(): pass """ - assert item_names_for(test_content) == ['test_first', 'test_second', 'test_third', 'test_four', 'test_five'] + assert item_names_for(test_content) == ['test_second', 'test_first', 'test_third'] def test_run_marker_registered(capsys): pytest.main('--markers') From 4742eedca16557f8f8f31b58cf9360aeb0cefc13 Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Fri, 31 Mar 2017 10:36:18 +0200 Subject: [PATCH 12/13] 2.6 support --- pytest_ordering/__init__.py | 5 ++++- tox.ini | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pytest_ordering/__init__.py b/pytest_ordering/__init__.py index 8d0ddac..7b43078 100644 --- a/pytest_ordering/__init__.py +++ b/pytest_ordering/__init__.py @@ -4,7 +4,10 @@ import operator import re import pytest -from collections import OrderedDict +try: + from collections import OrderedDict +except: + from ordereddict import OrderedDict import os import sys diff --git a/tox.ini b/tox.ini index 0e41cf6..ff9c1bf 100644 --- a/tox.ini +++ b/tox.ini @@ -1,9 +1,10 @@ # content of: tox.ini, put in same dir as setup.py [tox] -envlist = py26,py27,py33,py34,py35,pypy +envlist = py26,py27,py33,py34,py35,py36,pypy [testenv] deps=pytest pytest-cov + ordereddict commands= coverage run --source=pytest_ordering -m py.test tests coverage report -m --fail-under=95 From c571f1174ab0b2c641045d2156dc3b559578fc8a Mon Sep 17 00:00:00 2001 From: Jonas Zinn Date: Fri, 31 Mar 2017 11:08:38 +0200 Subject: [PATCH 13/13] all for the coverage --- pytest_ordering/__init__.py | 31 +++++++++++++++---------------- tox.ini | 2 +- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/pytest_ordering/__init__.py b/pytest_ordering/__init__.py index 7b43078..69a36fe 100644 --- a/pytest_ordering/__init__.py +++ b/pytest_ordering/__init__.py @@ -42,6 +42,13 @@ def pytest_configure(config): config.addinivalue_line('markers', config_line) +def get_filename(item): + name = item.location[0] + if os.sep in name: + name = item.location[0].rsplit(os.sep, 1)[1] + return name[:-3] + + def mark_binning(item, keys, start, end, before, after, unordered): match_order = re.compile(r"order(\d+)(:?,|$)") find_order = match_order.search(",".join(keys)) @@ -62,17 +69,13 @@ def mark_binning(item, keys, start, end, before, after, unordered): start.setdefault(order, []).append(item) elif before_mark: if "." not in before_mark: - prefix = item.location[0] - if os.sep in prefix: - prefix = prefix.rsplit(os.sep, 1)[1] - before_mark = prefix[:-3] + "." + before_mark + prefix = get_filename(item) + before_mark = prefix + "." + before_mark before.setdefault(before_mark, []).append(item) elif after_mark: if "." not in after_mark: - prefix = item.location[0] - if os.sep in prefix: - prefix = prefix.rsplit(os.sep, 1)[1] - after_mark = prefix[:-3] + "." + after_mark + prefix = get_filename(item) + after_mark = prefix + "." + after_mark after.setdefault(after_mark, []).append(item) else: @@ -107,10 +110,8 @@ def insert(items, sort): def insert_before( name, items, sort): regex_name = re.escape(name) + r"(:?\.\w+)?$" for pos, item in enumerate(sort): - prefix = item.location[0] - if os.sep in prefix: - prefix = item.location[0].rsplit(os.sep, 1)[1] - item_name = prefix[:-3] + "." + item.location[2] + prefix = get_filename(item) + item_name = prefix + "." + item.location[2] if re.match(regex_name, item_name): if pos == 0: sort[:] = items + sort @@ -122,10 +123,8 @@ def insert_before( name, items, sort): def insert_after(name, items, sort): regex_name = re.escape(name) + r"(:?\.\w+)?$" for pos, item in reversed(list(enumerate(sort))): - prefix = item.location[0] - if os.sep in prefix: - prefix = item.location[0].rsplit(os.sep, 1)[1] - item_name = prefix[:-3] + "." + item.location[2] + prefix = get_filename(item) + item_name = prefix + "." + item.location[2] if re.match(regex_name, item_name): sort[pos+1:1] = items return True diff --git a/tox.ini b/tox.ini index ff9c1bf..1f91b72 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ # content of: tox.ini, put in same dir as setup.py [tox] -envlist = py26,py27,py33,py34,py35,py36,pypy +envlist = py26,py27,py33,py34,py35,py,pypy [testenv] deps=pytest pytest-cov