From 14a3fba50a5a17dcbbf35bb00b78863db4af6eed Mon Sep 17 00:00:00 2001 From: Carlos Granados Date: Fri, 12 Dec 2025 00:28:42 +0100 Subject: [PATCH 01/16] doc: document `printSkippedSteps` formatter option (#211) --- user_guide/command_line_tool/formatting.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide/command_line_tool/formatting.rst b/user_guide/command_line_tool/formatting.rst index a9cb3d4..f57b32e 100644 --- a/user_guide/command_line_tool/formatting.rst +++ b/user_guide/command_line_tool/formatting.rst @@ -124,6 +124,8 @@ The following options are specific to the Pretty formatter: ``ShowOutputOption`` enum values, defaults to ``ShowOutputOption::Yes``. * ``shortSummary`` show just a list of failing scenarios at the end of the output. If false, a full summary (which also includes a list of failing steps) will be printed. Defaults to true +* ``printSkippedSteps`` If the output should include any steps which are skipped by the runner. Useful when you + don't want to see all the skipped steps after a failed step. Defaults to true Progress formatter ^^^^^^^^^^^^^^^^^^ From d44c5452b85ae95ca797b131a90ed896a66d6ea2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 23:29:00 +0000 Subject: [PATCH 02/16] chore(deps): bump urllib3 from 2.5.0 to 2.6.0 (#210) Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.5.0 to 2.6.0. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.5.0...2.6.0) --- updated-dependencies: - dependency-name: urllib3 dependency-version: 2.6.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c5c756e..99105ed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,7 +30,7 @@ sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 starlette==0.49.1 typing_extensions==4.13.1 -urllib3==2.5.0 +urllib3==2.6.0 uvicorn==0.34.0 watchfiles==1.0.4 websockets==15.0.1 From c396a2ca11c5b2c62011bb178090ec669e397d5a Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 8 Jan 2026 21:51:32 +0000 Subject: [PATCH 03/16] update to tell PHPUnit assertions stopped working (#208) * update to tell PHPUnit assertions stopped working refs Behat/Behat#1618 --------- Co-authored-by: Andrew Coulton --- quick_start.rst | 51 +++++++++++++++++++++----------------------- useful_resources.rst | 51 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 27 deletions(-) diff --git a/quick_start.rst b/quick_start.rst index 2cb8090..aad9bb7 100644 --- a/quick_start.rst +++ b/quick_start.rst @@ -455,21 +455,32 @@ code we could come up with to fulfil our scenario. Something like this: #[Then('I should have :arg1 product(s) in the basket')] public function iShouldHaveProductInTheBasket($count) { - // Normally you would import this class - we are using the fully qualified name - // to highlight that Behat does not come with an assertion tool (see note below). - \PHPUnit\Framework\Assert::assertCount( - intval($count), - $this->basket - ); + if (count($this->basket) !== intval($count)) { + throw new \Exception( + sprintf( + 'The basket should have %d item(s), but it has %d.', + intval($count), + count($this->basket) + ) + ); + } } #[Then('the overall basket price should be £:arg1')] public function theOverallBasketPriceShouldBePs($price) { - \PHPUnit\Framework\Assert::assertSame( - floatval($price), - $this->basket->getTotalPrice() - ); + $expectedPrice = floatval($price); + $actualPrice = $this->basket->getTotalPrice(); + + if ($expectedPrice !== $actualPrice) { + throw new \Exception( + sprintf( + 'Expected basket total price to be %s, but got %s.', + $expectedPrice, + $actualPrice + ) + ); + } } } @@ -477,27 +488,13 @@ As you can see, in order to test and implement our application, we introduced 2 ``Shelf`` and ``Basket``. The first is responsible for storing products and their prices, the second is responsible for the representation of our customer basket. Through appropriate step definitions we declare products' prices and add products to the basket. We then compare the -state of our ``Basket`` object with our expectations using PHPUnit assertions. +state of our ``Basket`` object with our expectations and throw exception if the expectations aren't met. .. note:: Behat doesn't come with its own assertion tool, but you can use any proper assertion - tool out there. A proper assertion tool is a library whose assertions throw - exceptions on failure. For example, if you're familiar with PHPUnit you can use - its assertions in Behat by installing it via composer: - - .. code-block:: bash - - $ php composer.phar require --dev phpunit/phpunit - - and then by simply using assertions in your steps: - - .. code-block:: php - - \PHPUnit\Framework\Assert::assertCount( - intval($count), - $this->basket - ); + tool out there. + Learn more about :ref:`assertion-tools`. Now try to execute your feature tests: diff --git a/useful_resources.rst b/useful_resources.rst index 4fe2abd..ec02afb 100644 --- a/useful_resources.rst +++ b/useful_resources.rst @@ -18,6 +18,57 @@ Integrating Behat with PHPStorm More information on integrating Behat with PHPStorm can be found in this `blog post`_. +.. _assertion-tools: + +Assertion tools +--------------- + +A proper assertion tool is a library whose assertions throw exceptions on failure. + +For example a list of the most known: + +- https://github.com/webmozarts/assert +- https://github.com/beberlei/assert +- https://github.com/zenstruck/assert + +.. caution:: + If you are familiar with PHPUnit, you can use its assertion library + .. code-block:: bash + + $ php composer.phar require --dev phpunit/phpunit + + and then by simply using assertions in your steps: + + .. code-block:: php + + \PHPUnit\Framework\Assert::assertCount( + intval($count), + $this->basket + ); + + **WARNING: using PHPUnit for assertions no longer works with PHP 11.3.0 and later out-of-the-box**. + + This is due to a change in how PHPUnit's internal components are initialized. The recommended workaround + to use the PHPUnit assertions is to bootstrap PHPUnit during Behat execution from a ``BeforeSuite`` hook: + + .. code-block:: php + + use Behat\Hook\BeforeSuite; + + class FeatureContext { + + #[BeforeSuite] + public static function initPhpunit() { + (new \PHPUnit\TextUI\Configuration\Builder())->build([]); + } + } + + If you have multiple suites, you may want to use a static variable in the hook to ensure the initialization only + runs once. + + Learn more at https://github.com/Behat/Behat/issues/1618. + + Behat cheat sheet ----------------- From 962ac3c33bad0c157b8b1dea608a20c53332703f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 08:52:19 +0000 Subject: [PATCH 04/16] chore(deps): bump urllib3 from 2.6.0 to 2.6.3 (#212) Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.6.0 to 2.6.3. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.6.0...2.6.3) --- updated-dependencies: - dependency-name: urllib3 dependency-version: 2.6.3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 99105ed..56542f3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,7 +30,7 @@ sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 starlette==0.49.1 typing_extensions==4.13.1 -urllib3==2.6.0 +urllib3==2.6.3 uvicorn==0.34.0 watchfiles==1.0.4 websockets==15.0.1 From 9542d3bc71f2ae0371466a8819eb514774667f22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Feb 2026 09:34:38 +0000 Subject: [PATCH 05/16] chore(deps): bump wheel from 0.44.0 to 0.46.2 (#215) Bumps [wheel](https://github.com/pypa/wheel) from 0.44.0 to 0.46.2. - [Release notes](https://github.com/pypa/wheel/releases) - [Changelog](https://github.com/pypa/wheel/blob/main/docs/news.rst) - [Commits](https://github.com/pypa/wheel/compare/0.44.0...0.46.2) --- updated-dependencies: - dependency-name: wheel dependency-version: 0.46.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 56542f3..6c3b82d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,4 +34,4 @@ urllib3==2.6.3 uvicorn==0.34.0 watchfiles==1.0.4 websockets==15.0.1 -wheel==0.44.0 +wheel==0.46.2 From ce791414220f60395030c3f51816c06ff68212e8 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 16 Feb 2026 20:54:15 +0000 Subject: [PATCH 06/16] docs: fix the PHPUnit caution block (#214) Render with a custom heading and fix incorrect markup within the block. --- useful_resources.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/useful_resources.rst b/useful_resources.rst index ec02afb..8f9cbc2 100644 --- a/useful_resources.rst +++ b/useful_resources.rst @@ -31,8 +31,11 @@ For example a list of the most known: - https://github.com/beberlei/assert - https://github.com/zenstruck/assert -.. caution:: +.. admonition:: Caution with PHPUnit + :class: caution + If you are familiar with PHPUnit, you can use its assertion library + .. code-block:: bash $ php composer.phar require --dev phpunit/phpunit From 29e9e41d611e77b0c6a6598c9e39707ee3414b7e Mon Sep 17 00:00:00 2001 From: Carlos Granados Date: Tue, 17 Feb 2026 09:10:12 +0100 Subject: [PATCH 07/16] docs: Behat and AI (#216) * docs: Behat and AI * Updates after code review --- behat_and_ai.rst | 84 ++++++++++++++++++++++++++++++++++++++++++++++++ index.rst | 1 + 2 files changed, 85 insertions(+) create mode 100644 behat_and_ai.rst diff --git a/behat_and_ai.rst b/behat_and_ai.rst new file mode 100644 index 0000000..59cbb43 --- /dev/null +++ b/behat_and_ai.rst @@ -0,0 +1,84 @@ +Behat and AI +============ + +AI coding agents can generate and modify code based on behavioural descriptions. +Behat provides a reliable way to define, verify, and preserve behaviour in these workflows. + +By expressing behaviour as executable scenarios, Behat ensures that AI-generated code +satisfies a clear and objective contract. + +Using Behat as a Behavioural Contract +------------------------------------- + +Behat scenarios define observable behaviour in a precise and executable form: + +.. code-block:: gherkin + + Feature: Refund processing + + Scenario: Refunding a paid order + Given there is a paid order + When I refund the order + Then the order should be marked as refunded + + Scenario: Prevent duplicate refunds + Given an order has already been refunded + When I refund the order + Then the refund should be rejected + +AI agents can implement features and use Behat to verify that the expected behaviour is satisfied. +When scenarios pass, the behavioural contract is fulfilled. + +Executable and Verifiable Behaviour +----------------------------------- + +Behat scenarios serve as executable specifications. They can be used by AI agents to: + +* verify correctness after implementing a feature +* detect behavioural regressions +* ensure behaviour remains consistent during refactoring + +Because scenarios are executable, they remain accurate as the system evolves. + +Generating Scenarios with AI +---------------------------- + +AI agents can generate Behat scenarios from behavioural descriptions. +These scenarios can then be reviewed, refined, and executed. + +This allows behaviour to be defined before or alongside implementation. + +Behat provides a structured and executable representation of behaviour +that can be used directly by AI tooling. + +Human Review and Iteration +-------------------------- + +As with any specification or testing tool, generated scenarios and assertions should be reviewed carefully. +It is critical to ensure that both the human-readable scenarios and the executable step definitions +accurately represent the intended behaviour. They also need to be robust enough to prove that +the actual behaviour matches the expectations, even if the implementation changes. + +Once validated, scenarios serve as the authoritative definition of the feature. AI agents can implement +or modify the system until all scenarios pass. + +This creates a reliable feedback loop where behaviour is defined, verified, and preserved. + +Maintaining Behaviour Over Time +------------------------------- + +With well-designed scenarios and step definitions, Behat ensures that behaviour remains stable as code changes. +AI agents can safely modify or refactor code, and Behat will detect any unintended behavioural changes. + +As long as scenarios pass, the defined behaviour is preserved. + +Behat MCP Server +---------------- + +Behat provides an `MCP (Model Context Protocol) server`_ that allows AI agents to interact +directly with Behat projects. + +The MCP server enables agents to discover scenarios, execute Behat, +and integrate behavioural verification into automated workflows. + +.. _`MCP (Model Context Protocol) server`: https://github.com/Behat/mcp-server diff --git a/index.rst b/index.rst index 0d6c844..c5af569 100644 --- a/index.rst +++ b/index.rst @@ -96,6 +96,7 @@ and many more. cookbooks releases useful_resources + behat_and_ai community .. _`Behaviour Driven Development`: https://en.wikipedia.org/wiki/Behavior-driven_development From e5517973639aefeadd30cffefbaa8c7eee28a7f7 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Fri, 6 Mar 2026 11:09:56 +0100 Subject: [PATCH 08/16] Fix the github URL for the "Edit on GitHub" button --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 5a7a7ac..be0fc71 100644 --- a/conf.py +++ b/conf.py @@ -61,7 +61,7 @@ logo_height = 50, # Base path for "Edit on GitHub" links - github_url="https://github.com/Behat/docs/blob/v3.0/", + github_url="https://github.com/Behat/docs/blob/v3.x/", # Global header / footer links as text|target header_links=', '.join([ From 9350739d7fa3cf678e882a867bd7ab96566dd82e Mon Sep 17 00:00:00 2001 From: Andrew Coulton Date: Thu, 26 Mar 2026 17:26:42 +0000 Subject: [PATCH 09/16] docs: document Gherkin parser compatibility mode (#219) --- user_guide/gherkin.rst | 12 +++ user_guide/gherkin/parser_mode.rst | 164 +++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 user_guide/gherkin/parser_mode.rst diff --git a/user_guide/gherkin.rst b/user_guide/gherkin.rst index 11589fb..57c4bcb 100644 --- a/user_guide/gherkin.rst +++ b/user_guide/gherkin.rst @@ -16,6 +16,12 @@ real, human language telling you what code you should write. If you're still new to Behat, jump into the :doc:`/quick_start` first, then return here to learn more about Gherkin. +.. note:: + + You can configure whether Behat's Gherkin parsing is compatible with + previous Behat versions, or with the official ``cucumber/gherkin`` + parsers. See :doc:`gherkin/parser_mode` for more details. + Gherkin Syntax -------------- @@ -103,3 +109,9 @@ run: Behat the ability to have multilanguage features in one suite. .. _`Business Readable, Domain Specific Language`: http://martinfowler.com/bliki/BusinessReadableDSL.html + +.. toctree:: + :maxdepth: 2 + :hidden: + + gherkin/parser_mode diff --git a/user_guide/gherkin/parser_mode.rst b/user_guide/gherkin/parser_mode.rst new file mode 100644 index 0000000..23885bb --- /dev/null +++ b/user_guide/gherkin/parser_mode.rst @@ -0,0 +1,164 @@ +Gherkin Compatibility Mode +========================== + +Behat uses the `behat/gherkin`_ library to parse your feature files into the data structures that +Behat will use to execute them. + +In most cases, this parses identically to `the official parsers provided by the Cucumber project`_. +However, there are some small differences in how our parser has traditionally treated some specific +syntax compared to the official parsers. + +To resolve this, we have added a ``GherkinCompatibilityMode`` setting to the parser. This setting +has two possible options: + +* ``GherkinCompatibilityMode::LEGACY`` - match our previous behaviour. This is the default in Behat 3.x. +* ``GherkinCompatibilityMode::GHERKIN_32`` - match the official parsers. This will become the default in Behat 4.0. + +.. caution:: + ``GherkinCompatibilityMode::GHERKIN_32`` is currently considered experimental. We expect that + there will be more changes to how the parser behaves in this mode before we mark it as stable. + +Configuring the parser mode +--------------------------- + +In Behat >= 3.30, you can specify the parser compatibility mode for your project in +your :doc:`/user_guide/configuration`: + +.. code-block:: php + + withProfile(new Profile('default') + ->withGherkinOptions(new GherkinOptions() + ->withCompatibilityMode(GherkinCompatibilityMode::GHERKIN_32) + ) + ) + ; + +Differences between parser modes +-------------------------------- + +Tables containing whitespace or escaped newlines +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In ``GHERKIN_32`` mode, table cells can include newlines, which will be unescaped during parsing. Note that +newlines are unescaped **after** we remove the cell padding. + +For example, with the following table: + +.. code-block:: gherkin + + Given 3 lines of poetry on 5 lines: + | \nraindrops--\nher last kiss\ngoodbye.\n | + +In ``GHERKIN_32`` mode, the table will parse as: + +.. code-block:: php + + [ + [ + <<getTags()`` will **include** the ``@`` prefix. In legacy mode, + this was removed. This may affect custom hooks / event listeners that inspect the tag values at + runtime. + + +File language +~~~~~~~~~~~~~ + +In ``GHERKIN_32`` mode, if a file includes a ``#language`` annotation: + +* Any whitespace in / around the tag will be ignored - so ``# language : fr`` will be + recognised as a valid language tag. In legacy mode, this would have been treated as a comment. +* Parsing fails if the language is not recognised - so ``#language: no-such`` will cause an error. + In legacy mode, this would have been ignored and parsing would continue in the default language. + +Whitespace following step keywords +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In ``GHERKIN_32`` mode, a space between a step keyword and the rest of the text is treated as part of the keyword. This +is because in a small number of languages there is no space after the keyword. + +With a step in English like ``Then something should happen``, if you call ``StepNode::getKeyword()`` then: + +* In ``GHERKIN_32`` mode the return value will be ``'Then '`` +* In ``LEGACY`` mode the return value will be ``'Then'`` + +In a language that does not place spaces after the keyword (e.g. Japanese), the return value will be the same in both +modes. + +Elements with descriptions +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Gherkin syntax allows multi-line descriptions on ``Feature:``, ``Background:``, ``Scenario:``, ``Scenario Outline:``, +and ``Examples:`` elements. + +Historically, we only parsed the description separately for a ``Feature`` node. For other nodes, we parsed the full +text as a multi-line title. + +In ``GHERKIN_32`` mode, if one of the elements listed above has multi-line text, then: + +* The first line (containing the keyword) will be parsed as the title. +* Following lines will be parsed as the description. +* Any blank lines between the title & description will be ignored (in legacy mode, these were included at the start of + the description). +* Any left padding will be removed from the first line of the description, but subsequent lines will have the same + left padding / indentation as the feature file. In legacy mode, we attempted to left-trim all lines to match the + indentation of the keyword. + + +.. _`behat/gherkin`: http://martinfowler.com/bliki/BusinessReadableDSL.html +.. _`the official parsers provided by the Cucumber project`: https://github.com/cucumber/gherkin From 9b06d1482ae0bf7b2c7f7e2d9ec5e961288deb58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:00:24 +0000 Subject: [PATCH 10/16] chore(deps): bump requests from 2.32.4 to 2.33.0 (#220) Bumps [requests](https://github.com/psf/requests) from 2.32.4 to 2.33.0. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.4...v2.33.0) --- updated-dependencies: - dependency-name: requests dependency-version: 2.33.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6c3b82d..bd8337b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,7 @@ Jinja2==3.1.6 MarkupSafe==3.0.2 packaging==24.1 Pygments==2.18.0 -requests==2.32.4 +requests==2.33.0 setuptools==78.1.1 sniffio==1.3.1 snowballstemmer==2.2.0 From 04000513fec80754e39191450c6672cf3cf22799 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 10:27:42 +0100 Subject: [PATCH 11/16] chore(deps): bump pygments from 2.18.0 to 2.20.0 (#221) Bumps [pygments](https://github.com/pygments/pygments) from 2.18.0 to 2.20.0. - [Release notes](https://github.com/pygments/pygments/releases) - [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES) - [Commits](https://github.com/pygments/pygments/compare/2.18.0...2.20.0) --- updated-dependencies: - dependency-name: pygments dependency-version: 2.20.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index bd8337b..e73e140 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ imagesize==1.4.1 Jinja2==3.1.6 MarkupSafe==3.0.2 packaging==24.1 -Pygments==2.18.0 +Pygments==2.20.0 requests==2.33.0 setuptools==78.1.1 sniffio==1.3.1 From a6f55907b89c6dbf106540f25f74534866b4f6e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 17 May 2026 10:21:39 +0100 Subject: [PATCH 12/16] chore(deps): bump urllib3 from 2.6.3 to 2.7.0 (#222) Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.6.3 to 2.7.0. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.6.3...2.7.0) --- updated-dependencies: - dependency-name: urllib3 dependency-version: 2.7.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e73e140..152c3a4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,7 +30,7 @@ sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 starlette==0.49.1 typing_extensions==4.13.1 -urllib3==2.6.3 +urllib3==2.7.0 uvicorn==0.34.0 watchfiles==1.0.4 websockets==15.0.1 From 9a230c46f338a66d09b3cd8b29faf1c78194fe7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 01:42:25 +0100 Subject: [PATCH 13/16] chore(deps): bump idna from 3.10 to 3.15 (#223) Bumps [idna](https://github.com/kjd/idna) from 3.10 to 3.15. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.md) - [Commits](https://github.com/kjd/idna/compare/v3.10...v3.15) --- updated-dependencies: - dependency-name: idna dependency-version: '3.15' dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 152c3a4..3ee67b2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ click==8.1.8 colorama==0.4.6 docutils==0.21.2 h11==0.16.0 -idna==3.10 +idna==3.15 imagesize==1.4.1 Jinja2==3.1.6 MarkupSafe==3.0.2 From b7676998f93f3712b88b80e3e8b6fd1851142e7e Mon Sep 17 00:00:00 2001 From: jdevinemt <65512359+jdevinemt@users.noreply.github.com> Date: Wed, 27 May 2026 11:06:41 -0600 Subject: [PATCH 14/16] Fixed incorrect "OR" tag specified for tagged hooks --- user_guide/context/hooks.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/user_guide/context/hooks.rst b/user_guide/context/hooks.rst index 066ff40..b7fd31a 100644 --- a/user_guide/context/hooks.rst +++ b/user_guide/context/hooks.rst @@ -267,7 +267,9 @@ Tagged Hooks Sometimes you may want a certain hook to run only for certain scenarios, features or steps. This can be achieved by associating a ``BeforeFeature``, ``AfterFeature``, ``BeforeScenario`` or ``AfterScenario`` hook with one -or more tags. You can also use ``OR`` (``||``) and ``AND`` (``&&``) tags: +or more tags. You can also use ``OR`` (``,``) and ``AND`` (``&&``) tags: + +Use the ``,`` tag to execute a hook when it has *any* of the provided tags: .. code-block:: php From 5a362eda5482d2463fbfba3e6e8a394b45888761 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 08:19:32 +0100 Subject: [PATCH 15/16] chore(deps): bump starlette from 0.49.1 to 1.0.1 (#225) Bumps [starlette](https://github.com/Kludex/starlette) from 0.49.1 to 1.0.1. - [Release notes](https://github.com/Kludex/starlette/releases) - [Changelog](https://github.com/Kludex/starlette/blob/main/docs/release-notes.md) - [Commits](https://github.com/Kludex/starlette/compare/0.49.1...1.0.1) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3ee67b2..26d1fcc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,7 +28,7 @@ sphinxcontrib-htmlhelp==2.1.0 sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 -starlette==0.49.1 +starlette==1.0.1 typing_extensions==4.13.1 urllib3==2.7.0 uvicorn==0.34.0 From f5a640e45b83a08200a986ac3147298fedc0bc6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2026 10:17:38 +0100 Subject: [PATCH 16/16] chore(deps): bump starlette from 1.0.1 to 1.3.1 (#226) Bumps [starlette](https://github.com/Kludex/starlette) from 1.0.1 to 1.3.1. - [Release notes](https://github.com/Kludex/starlette/releases) - [Changelog](https://github.com/Kludex/starlette/blob/main/docs/release-notes.md) - [Commits](https://github.com/Kludex/starlette/compare/1.0.1...1.3.1) --- updated-dependencies: - dependency-name: starlette dependency-version: 1.3.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 26d1fcc..926b4d4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,7 +28,7 @@ sphinxcontrib-htmlhelp==2.1.0 sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 -starlette==1.0.1 +starlette==1.3.1 typing_extensions==4.13.1 urllib3==2.7.0 uvicorn==0.34.0