[packages/python-behave] - added Fedora patches, drop 2to3 no longer supported by setuptools
qboosh
qboosh at pld-linux.org
Sun Oct 22 09:20:55 CEST 2023
commit 8a569cbe76eefd16f3b330f80d8c519a62814d23
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date: Sun Oct 22 09:22:50 2023 +0200
- added Fedora patches, drop 2to3 no longer supported by setuptools
behave-backport-for-py38-fixes.patch | 573 ++++++++++++++++++++++++
behave-drop_2to3.patch | 11 +
behave-invalid-escape-seq.patch | 82 ++++
behave-sphinx-extlinks.patch | 13 +
behave-tweak-tests-required-by-pytest-5.0.patch | 111 +++++
python-behave.spec | 18 +-
6 files changed, 803 insertions(+), 5 deletions(-)
---
diff --git a/python-behave.spec b/python-behave.spec
index 55c6823..9ba1652 100644
--- a/python-behave.spec
+++ b/python-behave.spec
@@ -16,6 +16,11 @@ Group: Libraries/Python
Source0: https://files.pythonhosted.org/packages/source/b/behave/behave-%{version}.tar.gz
# Source0-md5: 3f05c859a1c45f5ed33e925817ad887d
Patch0: %{name}-mock.patch
+Patch1: behave-backport-for-py38-fixes.patch
+Patch2: behave-tweak-tests-required-by-pytest-5.0.patch
+Patch3: behave-invalid-escape-seq.patch
+Patch4: behave-sphinx-extlinks.patch
+Patch5: behave-drop_2to3.patch
URL: https://pypi.org/project/behave/
%if %{with python2}
BuildRequires: python-modules >= 1:2.6
@@ -94,16 +99,21 @@ Dokumentacja API modułu Pythona behave.
%prep
%setup -q -n behave-%{version}
%patch0 -p1
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
%build
%if %{with python2}
%py_build
%if %{with tests}
-# can't get test_text__with_assert_failed_and_bytes_message test to work
+# can't get test_text__with_raised_exception_and_bytes_message test to work
# (LC_ALL=C.UTF-8 and PYTHONIOENCODING=utf-8 don't help)
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 \
-%{__python} -m pytest tests -k 'not test_text__with_assert_failed_and_bytes_message'
+%{__python} -m pytest tests -k 'not test_text__with_raised_exception_and_bytes_message'
%endif
%endif
@@ -111,11 +121,9 @@ PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 \
%py3_build
%if %{with tests}
-# test_text__with_... fail with some repr differences
-# some TestCaptureController tests die with "expected string or bytes-like object" TypeError
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 \
PYTHONPATH=$(pwd)/lib \
-%{__python3} -m pytest tests -k 'not (test_text__with_assert_failed_and_unicode_message or test_text__with_raised_exception_and_unicode_message or test_capturing__retrieve_captured_several_times or test_capturing__with_several_start_stop_cycles or test_make_capture_report or test_basics)'
+%{__python3} -m pytest tests
%endif
%endif
diff --git a/behave-backport-for-py38-fixes.patch b/behave-backport-for-py38-fixes.patch
new file mode 100644
index 0000000..fcb26f2
--- /dev/null
+++ b/behave-backport-for-py38-fixes.patch
@@ -0,0 +1,573 @@
+From 72257e2db209f60626e43a1335e656f868b72935 Mon Sep 17 00:00:00 2001
+From: Petr Schindler <pschindl at redhat.com>
+Date: Fri, 20 Sep 2019 08:38:18 +0200
+Subject: [PATCH] Backport for py38 fixes
+
+Cherry picked from commits:
+83906ba779956af9437defcb8975debb18440e0d
+ce8f2eddd832b34fb4f628d898383db16f5c92ed
+e69d28ea8ce3bf361b278bfe5e10cafa6bdf6760
+c000c88eb5239b87f299c85e83b349b0ef387ae7
+
+---
+ behave.ini | 3 +-
+ features/environment.py | 14 ++++++
+ features/step.duplicated_step.feature | 20 ++++----
+ issue.features/environment.py | 38 ++++++++++++---
+ issue.features/issue0330.feature | 64 ++++++++++++++++++++++++
+ issue.features/issue0446.feature | 70 +++++++++++++++++++++++++++
+ issue.features/issue0457.feature | 49 +++++++++++++++++++
+ test/test_runner.py | 6 +++
+ tests/api/_test_async_step34.py | 9 ++--
+ tests/unit/test_capture.py | 2 +
+ tox.ini | 2 +-
+ 11 files changed, 255 insertions(+), 22 deletions(-)
+
+diff --git a/behave.ini b/behave.ini
+index 431956d..1a18843 100644
+--- a/behave.ini
++++ b/behave.ini
+@@ -15,8 +15,9 @@ show_skipped = false
+ format = rerun
+ progress3
+ outfiles = rerun.txt
+- reports/report_progress3.txt
++ build/behave.reports/report_progress3.txt
+ junit = true
++junit_directory = build/behave.reports
+ logging_level = INFO
+ # logging_format = LOG.%(levelname)-8s %(name)-10s: %(message)s
+ # logging_format = LOG.%(levelname)-8s %(asctime)s %(name)-10s: %(message)s
+diff --git a/features/environment.py b/features/environment.py
+index 4744e89..3769ee4 100644
+--- a/features/environment.py
++++ b/features/environment.py
+@@ -1,5 +1,7 @@
+ # -*- coding: UTF-8 -*-
++# FILE: features/environemnt.py
+
++from __future__ import absolute_import, print_function
+ from behave.tag_matcher import ActiveTagMatcher, setup_active_tag_values
+ from behave4cmd0.setup_command_shell import setup_command_shell_processors4behave
+ import platform
+@@ -20,6 +22,15 @@ active_tag_value_provider = {
+ }
+ active_tag_matcher = ActiveTagMatcher(active_tag_value_provider)
+
++
++def print_active_tags_summary():
++ active_tag_data = active_tag_value_provider
++ print("ACTIVE-TAG SUMMARY:")
++ print("use.with_python.version=%s" % active_tag_data.get("python.version"))
++ # print("use.with_os=%s" % active_tag_data.get("os"))
++ print()
++
++
+ # -----------------------------------------------------------------------------
+ # HOOKS:
+ # -----------------------------------------------------------------------------
+@@ -30,11 +41,14 @@ def before_all(context):
+ setup_python_path()
+ setup_context_with_global_params_test(context)
+ setup_command_shell_processors4behave()
++ print_active_tags_summary()
++
+
+ def before_feature(context, feature):
+ if active_tag_matcher.should_exclude_with(feature.tags):
+ feature.skip(reason=active_tag_matcher.exclude_reason)
+
++
+ def before_scenario(context, scenario):
+ if active_tag_matcher.should_exclude_with(scenario.effective_tags):
+ scenario.skip(reason=active_tag_matcher.exclude_reason)
+diff --git a/features/step.duplicated_step.feature b/features/step.duplicated_step.feature
+index 59888b0..396cca2 100644
+--- a/features/step.duplicated_step.feature
++++ b/features/step.duplicated_step.feature
+@@ -32,11 +32,11 @@ Feature: Duplicated Step Definitions
+ AmbiguousStep: @given('I call Alice') has already been defined in
+ existing step @given('I call Alice') at features/steps/alice_steps.py:3
+ """
+- And the command output should contain:
+- """
+- File "features/steps/alice_steps.py", line 7, in <module>
+- @given(u'I call Alice')
+- """
++ # -- DISABLED: Python 3.8 traceback line numbers differ w/ decorators (+1).
++ # And the command output should contain:
++ # """
++ # File "features/steps/alice_steps.py", line 7, in <module>
++ # """
+
+
+ Scenario: Duplicated Step Definition in another File
+@@ -70,11 +70,11 @@ Feature: Duplicated Step Definitions
+ AmbiguousStep: @given('I call Bob') has already been defined in
+ existing step @given('I call Bob') at features/steps/bob1_steps.py:3
+ """
+- And the command output should contain:
+- """
+- File "features/steps/bob2_steps.py", line 3, in <module>
+- @given('I call Bob')
+- """
++ # -- DISABLED: Python 3.8 traceback line numbers differ w/ decorators (+1).
++ # And the command output should contain:
++ # """
++ # File "features/steps/bob2_steps.py", line 3, in <module>
++ # """
+
+ @xfail
+ Scenario: Duplicated Same Step Definition via import from another File
+diff --git a/issue.features/environment.py b/issue.features/environment.py
+index 3737155..dc8a7fb 100644
+--- a/issue.features/environment.py
++++ b/issue.features/environment.py
+@@ -1,5 +1,5 @@
+ # -*- coding: UTF-8 -*-
+-# FILE: features/environment.py
++# FILE: issue.features/environemnt.py
+ # pylint: disable=unused-argument
+ """
+ Functionality:
+@@ -7,17 +7,20 @@ Functionality:
+ * active tags
+ """
+
+-from __future__ import print_function
++
++from __future__ import absolute_import, print_function
+ import sys
+ import platform
+ import os.path
+ import six
+ from behave.tag_matcher import ActiveTagMatcher
+ from behave4cmd0.setup_command_shell import setup_command_shell_processors4behave
+-# PREPARED:
+-# from behave.tag_matcher import setup_active_tag_values
++# PREPARED: from behave.tag_matcher import setup_active_tag_values
+
+
++# ---------------------------------------------------------------------------
++# TEST SUPPORT: For Active Tags
++# ---------------------------------------------------------------------------
+ def require_tool(tool_name):
+ """Check if a tool (an executable program) is provided on this platform.
+
+@@ -45,12 +48,14 @@ def require_tool(tool_name):
+ # print("TOOL-NOT-FOUND: %s" % tool_name)
+ return False
+
++
+ def as_bool_string(value):
+ if bool(value):
+ return "yes"
+ else:
+ return "no"
+
++
+ def discover_ci_server():
+ # pylint: disable=invalid-name
+ ci_server = "none"
+@@ -67,11 +72,16 @@ def discover_ci_server():
+ return ci_server
+
+
++# ---------------------------------------------------------------------------
++# BEHAVE SUPPORT: Active Tags
++# ---------------------------------------------------------------------------
+ # -- MATCHES ANY TAGS: @use.with_{category}={value}
+ # NOTE: active_tag_value_provider provides category values for active tags.
++python_version = "%s.%s" % sys.version_info[:2]
+ active_tag_value_provider = {
+ "python2": str(six.PY2).lower(),
+ "python3": str(six.PY3).lower(),
++ "python.version": python_version,
+ # -- python.implementation: cpython, pypy, jython, ironpython
+ "python.implementation": platform.python_implementation().lower(),
+ "pypy": str("__pypy__" in sys.modules).lower(),
+@@ -81,17 +91,33 @@ active_tag_value_provider = {
+ }
+ active_tag_matcher = ActiveTagMatcher(active_tag_value_provider)
+
++
++def print_active_tags_summary():
++ active_tag_data = active_tag_value_provider
++ print("ACTIVE-TAG SUMMARY:")
++ print("use.with_python.version=%s" % active_tag_data.get("python.version"))
++ # print("use.with_platform=%s" % active_tag_data.get("platform"))
++ # print("use.with_os=%s" % active_tag_data.get("os"))
++ print()
++
++
++# ---------------------------------------------------------------------------
++# BEHAVE HOOKS:
++# ---------------------------------------------------------------------------
+ def before_all(context):
+ # -- SETUP ACTIVE-TAG MATCHER (with userdata):
+ # USE: behave -D browser=safari ...
+- # NOT-NEEDED: setup_active_tag_values(active_tag_value_provider,
+- # context.config.userdata)
++ # NOT-NEEDED:
++ # setup_active_tag_values(active_tag_value_provider, context.config.userdata)
+ setup_command_shell_processors4behave()
++ print_active_tags_summary()
++
+
+ def before_feature(context, feature):
+ if active_tag_matcher.should_exclude_with(feature.tags):
+ feature.skip(reason=active_tag_matcher.exclude_reason)
+
++
+ def before_scenario(context, scenario):
+ if active_tag_matcher.should_exclude_with(scenario.effective_tags):
+ scenario.skip(reason=active_tag_matcher.exclude_reason)
+diff --git a/issue.features/issue0330.feature b/issue.features/issue0330.feature
+index dc1ebe7..81cb6e2 100644
+--- a/issue.features/issue0330.feature
++++ b/issue.features/issue0330.feature
+@@ -70,6 +70,7 @@ Feature: Issue #330: Skipped scenarios are included in junit reports when --no-s
+ And note that "bob.feature is skipped"
+
+
++ @not.with_python.version=3.8
+ Scenario: Junit report for skipped feature is created with --show-skipped
+ When I run "behave --junit -t @tag1 --show-skipped @alice_and_bob.featureset"
+ Then it should pass with:
+@@ -83,6 +84,23 @@ Feature: Issue #330: Skipped scenarios are included in junit reports when --no-s
+ <testsuite errors="0" failures="0" name="bob.Bob" skipped="1" tests="1" time="0.0">
+ """
+
++ @use.with_python.version=3.8
++ Scenario: Junit report for skipped feature is created with --show-skipped
++ When I run "behave --junit -t @tag1 --show-skipped @alice_and_bob.featureset"
++ Then it should pass with:
++ """
++ 1 feature passed, 0 failed, 1 skipped
++ """
++ And a file named "test_results/TESTS-alice.xml" exists
++ And a file named "test_results/TESTS-bob.xml" exists
++ And the file "test_results/TESTS-bob.xml" should contain:
++ """
++ <testsuite name="bob.Bob" tests="1" errors="0" failures="0" skipped="1" time="0.0">
++ """
++ # -- HINT FOR: Python < 3.8
++ # <testsuite errors="0" failures="0" name="bob.Bob" skipped="1" tests="1" time="0.0">
++
++ @not.with_python.version=3.8
+ Scenario: Junit report for skipped scenario is neither shown nor counted with --no-skipped
+ When I run "behave --junit -t @tag1 --no-skipped"
+ Then it should pass with:
+@@ -102,7 +120,30 @@ Feature: Issue #330: Skipped scenarios are included in junit reports when --no-s
+ """
+ And note that "Charly2 is the skipped scenarion in charly.feature"
+
++ @use.with_python.version=3.8
++ Scenario: Junit report for skipped scenario is neither shown nor counted with --no-skipped
++ When I run "behave --junit -t @tag1 --no-skipped"
++ Then it should pass with:
++ """
++ 2 features passed, 0 failed, 1 skipped
++ 2 scenarios passed, 0 failed, 2 skipped
++ """
++ And a file named "test_results/TESTS-alice.xml" exists
++ And a file named "test_results/TESTS-charly.xml" exists
++ And the file "test_results/TESTS-charly.xml" should contain:
++ """
++ <testsuite name="charly.Charly" tests="1" errors="0" failures="0" skipped="0"
++ """
++ # -- HINT FOR: Python < 3.8
++ # <testsuite errors="0" failures="0" name="charly.Charly" skipped="0" tests="1"
++ And the file "test_results/TESTS-charly.xml" should not contain:
++ """
++ <testcase classname="charly.Charly" name="Charly2"
++ """
++ And note that "Charly2 is the skipped scenarion in charly.feature"
++
+
++ @not.with_python.version=3.8
+ Scenario: Junit report for skipped scenario is shown and counted with --show-skipped
+ When I run "behave --junit -t @tag1 --show-skipped"
+ Then it should pass with:
+@@ -122,3 +163,26 @@ Feature: Issue #330: Skipped scenarios are included in junit reports when --no-s
+ """
+ And note that "Charly2 is the skipped scenarion in charly.feature"
+
++
++ @use.with_python.version=3.8
++ Scenario: Junit report for skipped scenario is shown and counted with --show-skipped
++ When I run "behave --junit -t @tag1 --show-skipped"
++ Then it should pass with:
++ """
++ 2 features passed, 0 failed, 1 skipped
++ 2 scenarios passed, 0 failed, 2 skipped
++ """
++ And a file named "test_results/TESTS-alice.xml" exists
++ And a file named "test_results/TESTS-charly.xml" exists
++ And the file "test_results/TESTS-charly.xml" should contain:
++ """
++ <testsuite name="charly.Charly" tests="2" errors="0" failures="0" skipped="1"
++ """
++ # HINT: Python < 3.8
++ # <testsuite errors="0" failures="0" name="charly.Charly" skipped="1" tests="2"
++ And the file "test_results/TESTS-charly.xml" should contain:
++ """
++ <testcase classname="charly.Charly" name="Charly2" status="skipped"
++ """
++ And note that "Charly2 is the skipped scenarion in charly.feature"
++
+diff --git a/issue.features/issue0446.feature b/issue.features/issue0446.feature
+index a2ed892..901bdec 100644
+--- a/issue.features/issue0446.feature
++++ b/issue.features/issue0446.feature
+@@ -58,6 +58,7 @@ Feature: Issue #446 -- Support scenario hook-errors with JUnitReporter
+ behave.reporter.junit.show_hostname = False
+ """
+
++ @not.with_python.version=3.8
+ Scenario: Hook error in before_scenario()
+ When I run "behave -f plain --junit features/before_scenario_failure.feature"
+ Then it should fail with:
+@@ -86,6 +87,40 @@ Feature: Issue #446 -- Support scenario hook-errors with JUnitReporter
+ And note that "the traceback is contained in the XML element <error/>"
+
+
++ @use.with_python.version=3.8
++ Scenario: Hook error in before_scenario()
++ When I run "behave -f plain --junit features/before_scenario_failure.feature"
++ Then it should fail with:
++ """
++ 0 scenarios passed, 1 failed, 0 skipped
++ """
++ And the command output should contain:
++ """
++ HOOK-ERROR in before_scenario: RuntimeError: OOPS
++ """
++ And the file "reports/TESTS-before_scenario_failure.xml" should contain:
++ """
++ <testsuite name="before_scenario_failure.Alice" tests="1" errors="1" failures="0" skipped="0"
++ """
++ # -- HINT FOR: Python < 3.8
++ # <testsuite errors="1" failures="0" name="before_scenario_failure.Alice" skipped="0" tests="1"
++ And the file "reports/TESTS-before_scenario_failure.xml" should contain:
++ """
++ <error type="RuntimeError" message="HOOK-ERROR in before_scenario: RuntimeError: OOPS">
++ """
++ # -- HINT FOR: Python < 3.8
++ # <error message="HOOK-ERROR in before_scenario: RuntimeError: OOPS" type="RuntimeError">
++ And the file "reports/TESTS-before_scenario_failure.xml" should contain:
++ """
++ File "features/environment.py", line 6, in before_scenario
++ cause_hook_failure()
++ File "features/environment.py", line 2, in cause_hook_failure
++ raise RuntimeError("OOPS")
++ """
++ And note that "the traceback is contained in the XML element <error/>"
++
++
++ @not.with_python.version=3.8
+ Scenario: Hook error in after_scenario()
+ When I run "behave -f plain --junit features/after_scenario_failure.feature"
+ Then it should fail with:
+@@ -114,3 +149,38 @@ Feature: Issue #446 -- Support scenario hook-errors with JUnitReporter
+ raise RuntimeError("OOPS")
+ """
+ And note that "the traceback is contained in the XML element <error/>"
++
++
++ @use.with_python.version=3.8
++ Scenario: Hook error in after_scenario()
++ When I run "behave -f plain --junit features/after_scenario_failure.feature"
++ Then it should fail with:
++ """
++ 0 scenarios passed, 1 failed, 0 skipped
++ """
++ And the command output should contain:
++ """
++ Scenario: B1
++ Given another step passes ... passed
++ HOOK-ERROR in after_scenario: RuntimeError: OOPS
++ """
++ And the file "reports/TESTS-after_scenario_failure.xml" should contain:
++ """
++ <testsuite name="after_scenario_failure.Bob" tests="1" errors="1" failures="0" skipped="0"
++ """
++ # -- HINT FOR: Python < 3.8
++ # <testsuite errors="1" failures="0" name="after_scenario_failure.Bob" skipped="0" tests="1"
++ And the file "reports/TESTS-after_scenario_failure.xml" should contain:
++ """
++ <error type="RuntimeError" message="HOOK-ERROR in after_scenario: RuntimeError: OOPS">
++ """
++ # -- HINT FOR: Python < 3.8
++ # <error message="HOOK-ERROR in after_scenario: RuntimeError: OOPS" type="RuntimeError">
++ And the file "reports/TESTS-after_scenario_failure.xml" should contain:
++ """
++ File "features/environment.py", line 10, in after_scenario
++ cause_hook_failure()
++ File "features/environment.py", line 2, in cause_hook_failure
++ raise RuntimeError("OOPS")
++ """
++ And note that "the traceback is contained in the XML element <error/>"
+diff --git a/issue.features/issue0457.feature b/issue.features/issue0457.feature
+index f80640e..46f96e9 100644
+--- a/issue.features/issue0457.feature
++++ b/issue.features/issue0457.feature
+@@ -24,6 +24,7 @@ Feature: Issue #457 -- Double-quotes in error messages of JUnit XML reports
+ """
+
+
++ @not.with_python.version=3.8
+ Scenario: Use failing assertation in a JUnit XML report
+ Given a file named "features/fails1.feature" with:
+ """
+@@ -44,6 +45,31 @@ Feature: Issue #457 -- Double-quotes in error messages of JUnit XML reports
+ <failure message="FAILED: My name is "Alice""
+ """
+
++ @use.with_python.version=3.8
++ Scenario: Use failing assertation in a JUnit XML report
++ Given a file named "features/fails1.feature" with:
++ """
++ Feature:
++ Scenario: Alice
++ Given a step fails with message:
++ '''
++ My name is "Alice"
++ '''
++ """
++ When I run "behave --junit features/fails1.feature"
++ Then it should fail with:
++ """
++ 0 scenarios passed, 1 failed, 0 skipped
++ """
++ And the file "reports/TESTS-fails1.xml" should contain:
++ """
++ <failure type="AssertionError" message="FAILED: My name is "Alice"">
++ """
++ # -- HINT FOR: Python < 3.8
++ # <failure message="FAILED: My name is "Alice""
++
++
++ @not.with_python.version=3.8
+ Scenario: Use exception in a JUnit XML report
+ Given a file named "features/fails2.feature" with:
+ """
+@@ -63,3 +89,26 @@ Feature: Issue #457 -- Double-quotes in error messages of JUnit XML reports
+ """
+ <error message="My name is "Bob" and <here> I am"
+ """
++
++ @use.with_python.version=3.8
++ Scenario: Use exception in a JUnit XML report
++ Given a file named "features/fails2.feature" with:
++ """
++ Feature:
++ Scenario: Bob
++ Given a step fails with error and message:
++ '''
++ My name is "Bob" and <here> I am
++ '''
++ """
++ When I run "behave --junit features/fails2.feature"
++ Then it should fail with:
++ """
++ 0 scenarios passed, 1 failed, 0 skipped
++ """
++ And the file "reports/TESTS-fails2.xml" should contain:
++ """
++ <error type="RuntimeError" message="My name is "Bob" and <here> I am">
++ """
++ # -- HINT FOR: Python < 3.8
++ # <error message="My name is "Bob" and <here> I am"
+diff --git a/test/test_runner.py b/test/test_runner.py
+index 70a7002..1b5afa2 100644
+--- a/test/test_runner.py
++++ b/test/test_runner.py
+@@ -286,6 +286,7 @@ class TestContext(unittest.TestCase):
+ eq_("thing" in self.context, True)
+ del self.context.thing
+
++
+ class ExampleSteps(object):
+ text = None
+ table = None
+@@ -320,6 +321,7 @@ class ExampleSteps(object):
+ for keyword, pattern, func in step_definitions:
+ step_registry.add_step_definition(keyword, pattern, func)
+
++
+ class TestContext_ExecuteSteps(unittest.TestCase):
+ """
+ Test the behave.runner.Context.execute_steps() functionality.
+@@ -341,6 +343,8 @@ class TestContext_ExecuteSteps(unittest.TestCase):
+ runner_.config.stdout_capture = False
+ runner_.config.stderr_capture = False
+ runner_.config.log_capture = False
++ runner_.config.logging_format = None
++ runner_.config.logging_datefmt = None
+ runner_.step_registry = self.step_registry
+
+ self.context = runner.Context(runner_)
+@@ -658,6 +662,8 @@ class TestRunWithPaths(unittest.TestCase):
+ self.config.logging_filter = None
+ self.config.outputs = [Mock(), StreamOpener(stream=sys.stdout)]
+ self.config.format = ["plain", "progress"]
++ self.config.logging_format = None
++ self.config.logging_datefmt = None
+ self.runner = runner.Runner(self.config)
+ self.load_hooks = self.runner.load_hooks = Mock()
+ self.load_step_definitions = self.runner.load_step_definitions = Mock()
+diff --git a/tests/api/_test_async_step34.py b/tests/api/_test_async_step34.py
+index c93fb74..4e4edf4 100644
+--- a/tests/api/_test_async_step34.py
++++ b/tests/api/_test_async_step34.py
+@@ -37,15 +37,16 @@ from .testing_support_async import AsyncStepTheory
+ # -----------------------------------------------------------------------------
+ # TEST MARKERS:
+ # -----------------------------------------------------------------------------
+-python_version = float("%s.%s" % sys.version_info[:2])
++# DEPRECATED: @asyncio.coroutine decorator (since: Python >= 3.8)
++_python_version = float("%s.%s" % sys.version_info[:2])
++requires_py34_to_py37 = pytest.mark.skipif(not (3.4 <= _python_version < 3.8),
++ reason="Supported only for python.versions: 3.4 .. 3.7 (inclusive)")
+
+-# xfail = pytest.mark.xfail
+-py34_or_newer = pytest.mark.skipif(python_version < 3.4, reason="Needs Python >= 3.4")
+
+ # -----------------------------------------------------------------------------
+ # TESTSUITE:
+ # -----------------------------------------------------------------------------
+- at py34_or_newer
++ at requires_py34_to_py37
+ class TestAsyncStepDecorator34(object):
+
+ def test_step_decorator_async_run_until_complete2(self):
+diff --git a/tests/unit/test_capture.py b/tests/unit/test_capture.py
+index ac2655e..d9a3f3a 100644
+--- a/tests/unit/test_capture.py
++++ b/tests/unit/test_capture.py
+@@ -20,6 +20,8 @@ def create_capture_controller(config=None):
+ config.log_capture = True
+ config.logging_filter = None
+ config.logging_level = "INFO"
++ config.logging_format = "%(levelname)s:%(name)s:%(message)s"
++ config.logging_datefmt = None
+ return CaptureController(config)
+
+ def setup_capture_controller(capture_controller, context=None):
+diff --git a/tox.ini b/tox.ini
+index 92f6679..16a392c 100644
+--- a/tox.ini
++++ b/tox.ini
+@@ -28,7 +28,7 @@
+
+ [tox]
+ minversion = 2.3
+-envlist = py26, py27, py33, py34, py35, py36, pypy, docs
++envlist = py26, py27, py33, py34, py35, py36, py37, py38, pypy, docs
+ skip_missing_interpreters = True
+ sitepackages = False
+ indexserver =
+--
+2.23.0
+
diff --git a/behave-drop_2to3.patch b/behave-drop_2to3.patch
new file mode 100644
index 0000000..370ff43
--- /dev/null
+++ b/behave-drop_2to3.patch
@@ -0,0 +1,11 @@
+--- behave-1.2.6/setup.py.orig 2018-02-25 17:27:09.000000000 +0100
++++ behave-1.2.6/setup.py 2023-10-22 09:06:13.799948986 +0200
+@@ -100,8 +100,6 @@ setup(
+ "pylint",
+ ],
+ },
+- # MAYBE-DISABLE: use_2to3
+- use_2to3= bool(python_version >= 3.0),
+ license="BSD",
+ classifiers=[
+ "Development Status :: 4 - Beta",
diff --git a/behave-invalid-escape-seq.patch b/behave-invalid-escape-seq.patch
new file mode 100644
index 0000000..ef80a16
--- /dev/null
+++ b/behave-invalid-escape-seq.patch
@@ -0,0 +1,82 @@
+--- a/behave4cmd0/command_shell_proc.py
++++ b/behave4cmd0/command_shell_proc.py
+@@ -251,6 +251,6 @@
+ "No such file or directory: '(?P<path>.*)'",
+ "[Errno 2] No such file or directory:"), # IOError
+ ExceptionWithPathNormalizer(
+- '^\s*File "(?P<path>.*)", line \d+, in ',
++ r'^\s*File "(?P<path>.*)", line \d+, in ',
+ 'File "'),
+ ]
+--- a/tests/unit/test_behave4cmd_command_shell_proc.py
++++ b/tests/unit/test_behave4cmd_command_shell_proc.py
+@@ -1,5 +1,5 @@
+ # -*- coding: UTF-8 -*-
+-"""
++r"""
+
+ Regular expressions for winpath:
+ http://regexlib.com/Search.aspx?k=file+name
+@@ -61,7 +61,7 @@ def __call__(self, output):
+
+ line_processor_traceback = [
+ ExceptionWithPathNormalizer(
+- '^\s*File "(?P<path>.*)", line \d+, in ',
++ r'^\s*File "(?P<path>.*)", line \d+, in ',
+ ' File "'),
+ BehaveWinCommandOutputProcessor.line_processors[4],
+ ]
+--- a/tests/issues/test_issue0336.py
++++ b/tests/issues/test_issue0336.py
+@@ -52,6 +52,7 @@ def test_issue__with_default_encoding(self):
+ assert file_line_text in text2
+
+ # @require_python2
++ @pytest.mark.filterwarnings("ignore:invalid escape sequence")
+ def test__problem_exists_with_problematic_encoding(self):
+ """Test ensures that problem exists with encoding=unicode-escape"""
+ # -- NOTE: Explicit use of problematic encoding
+--- a/tests/issues/test_issue0495.py
++++ b/tests/issues/test_issue0495.py
+@@ -46,7 +46,7 @@
+ def test_issue(log_message):
+ @capture(level=logging.INFO)
+ def hook_after_scenario(context, message):
+- logging.warn(message)
++ logging.warning(message)
+ raise RuntimeError()
+
+ # -- PREPARE:
+--- a/test/test_parser.py
++++ b/test/test_parser.py
+@@ -2,7 +2,7 @@
+
+ from __future__ import absolute_import
+ from nose.tools import *
+-
++import pytest
+ from behave import i18n, model, parser
+
+ class Common(object):
+@@ -529,16 +529,17 @@
+ ('then', 'Then', 'stuff is in buckets', None, None),
+ ])
+
++ @pytest.mark.filterwarnings("ignore:invalid escape sequence")
+ def test_parses_feature_with_table_and_escaped_pipe_in_cell_values(self):
+ doc = u'''
+ Feature:
+ Scenario:
+ Given we have special cell values:
+ | name | value |
+- | alice | one\|two |
+- | bob |\|one |
+- | charly | one\||
+- | doro | one\|two\|three\|four |
++ | alice | one\\|two |
++ | bob |\\|one |
++ | charly | one\\||
++ | doro | one\\|two\\|three\\|four |
+ '''.lstrip()
+ feature = parser.parse_feature(doc)
+ assert(len(feature.scenarios) == 1)
diff --git a/behave-sphinx-extlinks.patch b/behave-sphinx-extlinks.patch
new file mode 100644
index 0000000..72a1419
--- /dev/null
+++ b/behave-sphinx-extlinks.patch
@@ -0,0 +1,13 @@
+--- a/docs/conf.py 2023-03-23 09:30:01.556715659 +0200
++++ b/docs/conf.py 2023-03-23 11:16:25.561357857 +0200
+@@ -44,8 +44,8 @@
+
+
+ extlinks = {
+- "pypi": ("https://pypi.python.org/pypi/%s", ""),
+- "github": ("https://github.com/%s", "github:/"),
++ "pypi": ("https://pypi.python.org/pypi/%s", "%s"),
++ "github": ("https://github.com/%s", "%s"),
+ "issue": ("https://github.com/behave/behave/issue/%s", "issue #"),
+ "youtube": ("https://www.youtube.com/watch?v=%s", "youtube:video="),
+ "behave": ("https://github.com/behave/behave", None),
diff --git a/behave-tweak-tests-required-by-pytest-5.0.patch b/behave-tweak-tests-required-by-pytest-5.0.patch
new file mode 100644
index 0000000..8c8ea37
--- /dev/null
+++ b/behave-tweak-tests-required-by-pytest-5.0.patch
@@ -0,0 +1,111 @@
+From aa1d0c5358ac35a3f222bdf95cdb9f44eeb0427b Mon Sep 17 00:00:00 2001
+From: jenisys <jenisys at users.noreply.github.com>
+Date: Fri, 5 Jul 2019 08:27:44 +0200
+Subject: [PATCH] Tweak tests, required by pytest >= 5.0. With pytest.raises
+ use str(e.value) instead of str(e) in some cases.
+
+---
+ tests/issues/test_issue0458.py | 2 +-
+ tests/unit/test_context_cleanups.py | 2 +-
+ tests/unit/test_textutil.py | 36 ++++++++++++++++++++---------
+ 3 files changed, 27 insertions(+), 13 deletions(-)
+
+diff --git a/tests/issues/test_issue0458.py b/tests/issues/test_issue0458.py
+index 1853ad6..f66f6d3 100644
+--- a/tests/issues/test_issue0458.py
++++ b/tests/issues/test_issue0458.py
+@@ -48,7 +48,7 @@ def test_issue(exception_class, message):
+ raise_exception(exception_class, message)
+
+ # -- SHOULD NOT RAISE EXCEPTION HERE:
+- text = _text(e)
++ text = _text(e.value)
+ # -- DIAGNOSTICS:
+ print(u"text"+ text)
+ print(u"exception: %s" % e)
+diff --git a/tests/unit/test_context_cleanups.py b/tests/unit/test_context_cleanups.py
+index b0e8ae6..bf0ab50 100644
+--- a/tests/unit/test_context_cleanups.py
++++ b/tests/unit/test_context_cleanups.py
+@@ -153,7 +153,7 @@ class TestContextCleanup(object):
+ with pytest.raises(AssertionError) as e:
+ with scoped_context_layer(context):
+ context.add_cleanup(non_callable)
+- assert "REQUIRES: callable(cleanup_func)" in str(e)
++ assert "REQUIRES: callable(cleanup_func)" in str(e.value)
+
+ def test_on_cleanup_error__prints_error_by_default(self, capsys):
+ def bad_cleanup_func():
+diff --git a/tests/unit/test_textutil.py b/tests/unit/test_textutil.py
+index 3728c38..77e800f 100644
+--- a/tests/unit/test_textutil.py
++++ b/tests/unit/test_textutil.py
+@@ -212,9 +212,11 @@ class TestObjectToTextConversion(object):
+ with pytest.raises(AssertionError) as e:
+ assert False, message
+
+- text2 = text(e)
+- expected = u"AssertionError: %s" % message
+- assert text2.endswith(expected)
++ # -- FOR: pytest < 5.0
++ # expected = u"AssertionError: %s" % message
++ text2 = text(e.value)
++ assert u"AssertionError" in text(e)
++ assert message in text2, "OOPS: text=%r" % text2
+
+ @requires_python2
+ @pytest.mark.parametrize("message", [
+@@ -224,11 +226,20 @@ class TestObjectToTextConversion(object):
+ # -- ONLY PYTHON2: Use case makes no sense for Python 3.
+ bytes_message = message.encode(self.ENCODING)
+ with pytest.raises(AssertionError) as e:
+- assert False, bytes_message
+-
+- text2 = text(e)
+- expected = u"AssertionError: %s" % message
+- assert text2.endswith(expected)
++ try:
++ assert False, bytes_message
++ except UnicodeDecodeError as uni_error:
++ # -- SINCE: Python 2.7.15
++ decode_error_occured = True
++ expected_decode_error = "'ascii' codec can't decode byte 0xc3 in position 0"
++ assert expected_decode_error in str(uni_error)
++ assert False, bytes_message.decode(self.ENCODING)
++
++ # -- FOR: pytest < 5.0
++ # expected = u"AssertionError: %s" % message
++ print("decode_error_occured(ascii)=%s" % decode_error_occured)
++ text2 = text(e.value)
++ assert message in text2, "OOPS: text=%r" % text2
+
+ @pytest.mark.parametrize("exception_class, message", [
+ (AssertionError, u"Ärgernis"),
+@@ -240,10 +251,13 @@ class TestObjectToTextConversion(object):
+ with pytest.raises(exception_class) as e:
+ raise exception_class(message)
+
+- text2 = text(e)
++ # -- FOR: pytest < 5.0
++ # expected = u"AssertionError: %s" % message
++ text2 = text(e.value)
+ expected = u"%s: %s" % (exception_class.__name__, message)
+ assert isinstance(text2, six.text_type)
+- assert text2.endswith(expected)
++ assert exception_class.__name__ in str(e)
++ assert message in text2, "OOPS: text=%r" % text2
+
+ @requires_python2
+ @pytest.mark.parametrize("exception_class, message", [
+@@ -257,7 +271,7 @@ class TestObjectToTextConversion(object):
+ with pytest.raises(exception_class) as e:
+ raise exception_class(bytes_message)
+
+- text2 = text(e)
++ text2 = text(e.value)
+ unicode_message = bytes_message.decode(self.ENCODING)
+ expected = u"%s: %s" % (exception_class.__name__, unicode_message)
+ assert isinstance(text2, six.text_type)
+--
+2.26.2
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/python-behave.git/commitdiff/8a569cbe76eefd16f3b330f80d8c519a62814d23
More information about the pld-cvs-commit
mailing list