[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