behat/gherkin
Gherkin DSL parser for PHP
v4.17.0
190M downloads/mo
#399 most downloaded on Packagist
Behat/Gherkin
What this package is like to depend on
Last release 3 months ago
18 May 2026
Ships unpredictably
gaps range from 1 weeks to 3.0 years
Rarely documented
notes for 10 of 68 stable releases
Nothing withdrawn
no release was ever pulled
15 years old
68 releases · first in 2011
4 releases in the last 12 months
see the full history below
Release timeline
68 releases · Dec 2011 to May 2026Releases
latest 60 of 68-
v4.17.018 May 2026Release notes
Open source →Changed
Added
- Add a
getFullText()method to a StepNode - returns the keyword & text as it appears in the feature file by @acoulton in #421
Fixed
- Wrap NoSuchLanguageException in a parser exception by @stof in #419
- Ignore whitespace around operators in tag filter strings by @acoulton in #416
Internal
- Update cucumber/gherkin parity tests and translations to v39.1.0 by @behat-gherkin-updater[bot] in #409, #411, and #420
- refactor: Only parse tag filter expression once by @acoulton in #418
- Fix Phpstan errors in current master build by @acoulton in #413
- Bump github actions versions by @dependabot[bot] in #412, #414 and #415
Release notes
Open source →Changed
- Emit deprecation if filter string does not contain @ prefixes by @acoulton in https://github.com/Behat/Gherkin/pull/417
Added
- Add a
getFullText()method to a StepNode - returns the keyword & text as it appears in the feature file by @acoulton in https://github.com/Behat/Gherkin/pull/421
Fixed
- Wrap NoSuchLanguageException in a parser exception by @stof in https://github.com/Behat/Gherkin/pull/419
- Ignore whitespace around operators in tag filter strings by @acoulton in https://github.com/Behat/Gherkin/pull/416
Internal
- Update cucumber/gherkin parity tests and translations to v39.1.0 by @behat-gherkin-updater[bot] in https://github.com/Behat/Gherkin/pull/409, https://github.com/Behat/Gherkin/pull/411, and https://github.com/Behat/Gherkin/pull/420
- refactor: Only parse tag filter expression once by @acoulton in https://github.com/Behat/Gherkin/pull/418
- Fix Phpstan errors in current master build by @acoulton in https://github.com/Behat/Gherkin/pull/413
- Bump github actions versions by @dependabot[bot] in https://github.com/Behat/Gherkin/pull/412, https://github.com/Behat/Gherkin/pull/414 and https://github.com/Behat/Gherkin/pull/415
- Add a
-
v4.16.108 Dec 2025Release notes
Open source →Fixed
- Reinstate support for tag filter expressions without a leading
@(e.g.wip&&~slowinstead of@wip&&~@slow).
This syntax was never officially supported, but previously worked and was broken by 4.16.0. We have temporarily
fixed this, but it is deprecated and will be removed in the next major version. By @acoulton in #407
Release notes
Open source →Fixed
- Reinstate support for tag filter expressions without a leading
@(e.g.wip&&~slowinstead of@wip&&~@slow). This syntax was never officially supported, but previously worked and was broken by 4.16.0. We have temporarily fixed this, but it is deprecated and will be removed in the next major version.
- Reinstate support for tag filter expressions without a leading
-
v4.16.008 Dec 2025Release notes
Open source →Changed
- Further improvements to parser parity when the experimental
gherkin-32compatibility mode is enabled:
Fixed
Internal
- Add
Stringableto classes implementing __toString() by @acoulton in #402 - Fix cucumber variant assertions to include inherited properties by @acoulton in #394
- Update cucumber/gherkin parity tests to 37.0.0 by @behat-gherkin-updater[bot] in #397 and #398
- update_cucumber script should not fail on manually created releases by @acoulton in #396
- Add funding links and information by @acoulton in #401
Release notes
Open source →Changed
- Further improvements to parser parity when the experimental
gherkin-32compatibility mode is enabled:
Fixed
- Fix the implementation of the default dialect for the keywords provider by @stof in #404
Internal
- Add
Stringableto classes implementing __toString() by @acoulton in #402 - Fix cucumber variant assertions to include inherited properties by @acoulton in #394
- Update cucumber/gherkin parity tests to 37.0.0 by @behat-gherkin-updater[bot] in #397 and #398
- update_cucumber script should not fail on manually created releases by @acoulton in #396
- Add funding links and information by @acoulton in #401
- Further improvements to parser parity when the experimental
-
v4.15.005 Nov 2025Release notes
Open source →Changed
- Added a new ParserInterface and deprecated extending the core Lexer, Parser and Node classes by @acoulton in #354
- Deprecate the CucumberNDJsonAstLoader (which was only intended for internal use by our tests) by @stof in #356
- By default, the parser ignores invalid language tags (e.g.
#language:no-such) and falls back to the default language (e.g.en). Previously, the resultantFeatureNode::getLanguage()would return the original invalid value from the feature file - it will now return the language that was actually used for parsing. By @stof in #350
Added
- Introduce a DialectProviderInterface matching the modern cucumber API. This will replace the existing Keywords API in a future major release. By @stof in #350
- Introduce configurable
GherkinCompatibilityModeto control how gherkin files are parsed. In the defaultlegacymode, there is no change to parsing. In the new experimentalgherkin-32mode, files will in future be parsed consistently with the official cucumber/gherkin parsers. This mode is not yet complete - in this first release:- Whitespace within description nodes will not be trimmed by @acoulton in #349
- Invalid language tags will cause an exception by @stof in #357
- Step keywords will not be trimmed by @stof in #360
- Language tags can include whitespace by @acoulton in #358
\nliterals in table cells will be parsed as newlines by @stof in #359 and #391
- Improved translations for
ru(Russian) andaf(Afrikaans) from cucumber/gherkin in #381 and #386 - Support PHP 8.5 by @acoulton in #388
Fixed
- Improve phpdoc / phpstan type-hinting of the lexer and parser by @uuf6429 in #344 and @stof in #363
- Handle race conditions when creating cache directory by @uuf6429 in #373
- Throw if Loader->load() called with unsupported resource by @uuf6429 in #372
- Use default file cache key if
behat/gherkinversion is unknown by @uuf6429 in #370
Internal
- Enable PHPStan level 10 and resolve remaining warnings by @uuf6429 in #368
- Remove duplication and improve robustness in filesystem operations by @uuf6429 in #365 and #367
- Explicitly cover expected departures from cucumber gherkin parsing with tests by @acoulton in #392
- Update cucumber/gherkin parity tests to v36.0.0 in #355, #376 #378, #381, #385, #386 and #387
- Fixes and improvements to the cucumber update CI job by @acoulton in #374,
#375, #379 and #380 - Minor coding style fixes by @acoulton in #377 and #383
- Minor code improvements to Lexer/Parser implementation by @uuf6429 in #352
- Minor code improvements to TableNode by @uuf6429 in #366
- Add native typehints where this does not break BC by @stof in #353
- Fix typo of a PHPStan alias type by @uuf6429 in #371
- Fix github actions workflow job name by @uuf6429 in #369
Release notes
Open source →Changed
- Added a new ParserInterface and deprecated extending the core Lexer, Parser and Node classes by @acoulton in #354
- Deprecate the CucumberNDJsonAstLoader (which was only intended for internal use by our tests) by @stof in #356
- By default, the parser ignores invalid language tags (e.g.
#language:no-such) and falls back to the default language (e.g.en). Previously, the resultantFeatureNode::getLanguage()would return the original invalid value from the feature file - it will now return the language that was actually used for parsing. By @stof in #350
Added
- Introduce a DialectProviderInterface matching the modern cucumber API. This will replace the existing Keywords API in a future major release. By @stof in #350
- Introduce configurable
GherkinCompatibilityModeto control how gherkin files are parsed. In the defaultlegacymode, there is no change to parsing. In the new experimentalgherkin-32mode, files will in future be parsed consistently with the official cucumber/gherkin parsers. This mode is not yet complete - in this first release:- Whitespace within description nodes will not be trimmed by @acoulton in #349
- Invalid language tags will cause an exception by @stof in #357
- Step keywords will not be trimmed by @stof in #360
- Language tags can include whitespace by @acoulton in #358
\nliterals in table cells will be parsed as newlines by @stof in #359 and #391
- Improved translations for
ru(Russian) andaf(Afrikaans) from cucumber/gherkin in #381 and #386 - Support PHP 8.5 by @acoulton in #388
Fixed
- Improve phpdoc / phpstan type-hinting of the lexer and parser by @uuf6429 in #344 and @stof in #363
- Handle race conditions when creating cache directory by @uuf6429 in #373
- Throw if Loader->load() called with unsupported resource by @uuf6429 in #372
- Use default file cache key if
behat/gherkinversion is unknown by @uuf6429 in #370
Internal
- Enable PHPStan level 10 and resolve remaining warnings by @uuf6429 in #368
- Remove duplication and improve robustness in filesystem operations by @uuf6429 in #365 and #367
- Explicitly cover expected departures from cucumber gherkin parsing with tests by @acoulton in #392
- Update cucumber/gherkin parity tests to v36.0.0 in #355, #376 #378, #381, #385 #386 and #387
- Fixes and improvements to the cucumber update CI job by @acoulton in #374, #375, #379 and #380
- Minor coding style fixes by @acoulton in #377 and #383
- Minor code improvements to Lexer/Parser implementation by @uuf6429 in #352
- Minor code improvements to TableNode by @uuf6429 in #366
- Add native typehints where this does not break BC by @stof in #353
- Fix typo of a PHPStan alias type by @uuf6429 in #371
- Fix github actions workflow job name by @uuf6429 in #369
-
v4.14.023 May 2025Release notes
Open source →Changed
- Throw ParserException if file ends with tags by @acoulton in #313
- Throw ParserException if Background comes after first Scenario by @acoulton in #343
- For compatibility with the official cucumber/gherkin parsers, we now accept some gherkin syntax that would previously have triggered a ParserException. Users may wish to consider running a tool like gherkin-lint in CI to detect incomplete feature files or valid-but-unusual gherkin syntax. The specific changes are:
- Parse
ScenarioandScenario Outlineas synonyms depending on the presence (or not) of anExamples:keyword.
by @acoulton in #316 and #324 - Do not throw on some unexpected Feature / Language tags by @acoulton in #323
- Do not throw on
.featurefile that does not contain a Feature by @acoulton in #340 - Ignore content after table right-hand
|(instead of throwing) by @acoulton in #341
- Parse
- Remove the line length from the NewLine token value by @stof in #338
- Added precise PHPStan type information by @stof in #332, #333, #339 and #334
Internal
- Make private props readonly; fix tests by @uuf6429 in #319
- Use the
Yaml::parseFileAPI to handle Yaml files by @stof in #335 - test: Make CucumberND name reading consistent by @uuf6429 in #309
- test: Use vfsStream to simplify / improve filesystem-related tests by @uuf6429 in #298
- test: Handle optional tableHeader when loading NDJson examples by @uuf6429 in #294
- test: Refactor valid ParserExceptionsTest examples into cucumber/gherkin testdata by @acoulton in #322
- test: Compare step arguments when checking gherkin parity by @acoulton in #325
- test: Use a custom object comparator to ignore the keywordType of StepNode by @stof in #331
- ci: Add conventional title to gherkin update, error on missing asserts by @acoulton in #314
- Assert that preg_split does not fail when splitting a table row by @stof in #337
- Add assertions in the parser to reflect the structure of tokens by @stof in #342
- style: Define and change phpdoc order coding style by @uuf6429 in #345
Release notes
Open source →Changed
- Throw ParserException if file ends with tags by @acoulton in #313
- Throw ParserException if Background comes after first Scenario by @acoulton in #343
- For compatibility with the official cucumber/gherkin parsers, we now accept some gherkin syntax that would previously
have triggered a ParserException. Users may wish to consider running a tool like gherkin-lint in CI to detect
incomplete feature files or valid-but-unusual gherkin syntax. The specific changes are:
- Parse
ScenarioandScenario Outlineas synonyms depending on the presence (or not) of anExamples:keyword. by @acoulton in #316 and #324 - Do not throw on some unexpected Feature / Language tags by @acoulton in #323
- Do not throw on
.featurefile that does not contain a Feature by @acoulton in #340 - Ignore content after table right-hand
|(instead of throwing) by @acoulton in #341
- Parse
- Remove the line length from the NewLine token value by @stof in #338
- Added precise PHPStan type information by @stof in #332, #333, #339 and #334
Internal
- Make private props readonly; fix tests by @uuf6429 in #319
- Use the
Yaml::parseFileAPI to handle Yaml files by @stof in #335 - test: Make CucumberND name reading consistent by @uuf6429 in #309
- test: Use vfsStream to simplify / improve filesystem-related tests by @uuf6429 in #298
- test: Handle optional tableHeader when loading NDJson examples by @uuf6429 in #294
- test: Refactor valid ParserExceptionsTest examples into cucumber/gherkin testdata by @acoulton in #322
- test: Compare step arguments when checking gherkin parity by @acoulton in #325
- test: Use a custom object comparator to ignore the keywordType of StepNode by @stof in #331
- ci: Add conventional title to gherkin update, error on missing asserts by @acoulton in #314
- Assert that preg_split does not fail when splitting a table row by @stof in #337
- Add assertions in the parser to reflect the structure of tokens by @stof in #342
- style: Define and change phpdoc order coding style by @uuf6429 in #345
-
v4.13.006 May 2025Release notes
Open source →Changed
- Files have been moved to flatten paths into a PSR-4 structure (instead of the previous PSR-0). This may affect users who are requiring files directly rather than using the composer autoloader as expected. See the 4.12.0 release for the new CachedArrayKeywords::withDefaultKeywords()
to use thei18n.php` file without depending on paths to other files in this repo. By @uuf6429 in #288
Added
- ExampleTableNode now implements TaggedNodeInterface. Also refactored node tag handling methods. By @uuf6429 in #289
- Improve some exceptions thrown when parsing invalid feature files. Also increased test coverage. By @uuf6429 in #295
- New translations for
amh(Amharic),be(Belarusian) andml(Malayalam) from cucumber/gherkin in #306 - Improved translations / whitespace for
ga(Irish),it(Italian),ja(Japanese),ka(Georgian) andko(Korean) from cucumber/gherkin in #306
Internal
- Fix & improve automatic CI updates to newer cucumber/gherkin test data and translations. By @acoulton in #300, #302, #304, #305
- Update code style and resolve PHPStan warnings (up to level 9) in tests and CI scripts. By @uuf6429 in #296, #297 and #307
- Make tests that expect exceptions more explicit by @uuf6429 in #310
- Improve CI workflows and integrate Codecov reporting by @uuf6429 in #299 and #301
- Refactor tag filtering implementation by @uuf6429 in #308
- Update cucumber/gherkin parity tests to v32.1.1 in #306
Release notes
Open source →Changed
- Files have been moved to flatten paths into a PSR-4 structure (instead of the previous PSR-0). This may affect users
who are requiring files directly rather than using the composer autoloader as expected.
See the 4.12.0 release for the new
CachedArrayKeywords::withDefaultKeywords()to use thei18n.phpfile without depending on paths to other files in this repo. By @uuf6429 in #288
Added
- ExampleTableNode now implements TaggedNodeInterface. Also refactored node tag handling methods. By @uuf6429 in #289
- Improve some exceptions thrown when parsing invalid feature files. Also increased test coverage. By @uuf6429 in #295
- New translations for
amh(Amharic),be(Belarusian) andml(Malayalam) from cucumber/gherkin in #306 - Improved translations / whitespace for
ga(Irish),it(Italian),ja(Japanese),ka(Georgian) andko(Korean) from cucumber/gherkin in #306
Internal
- Fix & improve automatic CI updates to newer cucumber/gherkin test data and translations. By @acoulton in #300, #302, #304, #305
- Update code style and resolve PHPStan warnings (up to level 9) in tests and CI scripts. By @uuf6429 in #296, #297 and #307
- Make tests that expect exceptions more explicit by @uuf6429 in #310
- Improve CI workflows and integrate Codecov reporting by @uuf6429 in #299 and #301
- Refactor tag filtering implementation by @uuf6429 in #308
- Update cucumber/gherkin parity tests to v32.1.1 in #306
- Files have been moved to flatten paths into a PSR-4 structure (instead of the previous PSR-0). This may affect users who are requiring files directly rather than using the composer autoloader as expected. See the 4.12.0 release for the new CachedArrayKeywords::withDefaultKeywords()
-
v4.12.026 Feb 2025Release notes
Open source →Changed
- Gherkin::VERSION is deprecated and will not be updated, use the composer runtime API if you need to identify the running version. This also changes the value used to namespace cached feature files. by @acoulton in #279
Added
- Provide
CachedArrayKeywords::withDefaultKeywords()to create an instance without an external dependency on the path to thei18n.phpfile in this repo. NOTE that paths to source files will change in the next Gherkin release - use the new constructor to avoid any impact. by @carlos-granados in #290
Internal
- Upgrade to phpunit 10 by @uuf6429 in #275
- Remove redundant files by @uuf6429 in #278
- Update documentation by @uuf6429 in #274
- Adopt PHP CS Fixer and apply code styles by @uuf6429 in #277
- Add PHPStan and improve / fix docblock annotations and type-safety within methods to achieve level 5 by @uuf6429 in #276, #281, #282, and #287
Release notes
Open source →Changed
- Gherkin::VERSION is deprecated and will not be updated, use the composer runtime API if you need to identify the running version. This also changes the value used to namespace cached feature files. by @acoulton in #279
Added
- Provide
CachedArrayKeywords::withDefaultKeywords()to create an instance without an external dependency on the path to thei18n.phpfile in this repo. NOTE that paths to source files will change in the next Gherkin release - use the new constructor to avoid any impact. by @carlos-granados in #290
Internal
- Upgrade to phpunit 10 by @uuf6429 in #275
- Remove redundant files by @uuf6429 in #278
- Update documentation by @uuf6429 in #274
- Adopt PHP CS Fixer and apply code styles by @uuf6429 in #277
- Add PHPStan and improve / fix docblock annotations and type-safety within methods to achieve level 5 by @uuf6429 in #276, #281, #282, and #287
-
v4.11.006 Dec 2024Release notes
Open source →Changed
- Drop support for PHP < 8.1, Symfony < 5.4 and Symfony 6.0 - 6.3. In future we will drop support for PHP and symfony
versions as they reach EOL. by @acoulton in #272 - Deprecated
ExampleNode::getTitle()andScenarioNode::getTitle()in favour of new methods with clearer meaning.
by @uuf6429 in #271
Added
- Added
(ExampleNode|ScenarioNode)::getName()to access human-readable names for examples and scenarios,
andExampleNode::getExampleText()for the string content of the example table row.
by @uuf6429 in #271
Internal
Release notes
Open source →Changed
- Drop support for PHP < 8.1, Symfony < 5.4 and Symfony 6.0 - 6.3. In future we will drop support for PHP and symfony versions as they reach EOL. by @acoulton in #272
- Deprecated
ExampleNode::getTitle()andScenarioNode::getTitle()in favour of new methods with clearer meaning. by @uuf6429 in #271
Added
- Added
(ExampleNode|ScenarioNode)::getName()to access human-readable names for examples and scenarios, andExampleNode::getExampleText()for the string content of the example table row. by @uuf6429 in #271
Internal
- Enable dependabot for github actions workflows by @jrfnl in #261
- Drop support for PHP < 8.1, Symfony < 5.4 and Symfony 6.0 - 6.3. In future we will drop support for PHP and symfony
-
v4.10.019 Oct 2024Release notes
Open source →Changed
- ⚠ Backslashes in feature files must now be escaped
Gherkin syntax treats\as an escape character, which must be escaped (\\) to use it as a
literal value. Historically, this was not being parsed correctly. This release fixes that bug,
but means that if your scenarios currently use unescaped\you will need to replace each one
with\\to achieve the same parsed result.
By @everzet in 5a0836d.
Added
- Symfony 6 and 7 thanks to @tacman in #257
- PHP 8.4 support thanks to @heiglandreas in #258 and @jrfnl in #262
Fixed
Internal
- Sync teststuite with Cucumber 24.1.0
- Fix PHPUnit 10 deprecation messages
- A lot of great CI work by @heiglandreas and @jrfnl
Note: 4.10.0 was actually released by @everzet on 2024-10-19, but just as a bare git tag - I've just marked it up as an official github release to avoid confusion,
- ⚠ Backslashes in feature files must now be escaped
-
v4.9.012 Oct 2021Release notes
Open source →What's Changed
- Simplify the boolean condition for the tag matching by @stof in #219
- Remove symfony phpunit bridge by @ciaranmcnulty in #220
- Ignore the bin folder in archives by @stof in #226
- Cast table node exceptions into ParserExceptions when throwing by @ciaranmcnulty in #216
- Cucumber changelog in PRs and using correct hash by @ciaranmcnulty in #225
- Support alternative docstrings format (```) by @ciaranmcnulty in #214
- Fix DocBlocks (Boolean -> bool) by @simonhammes in #237
- Tag parsing by @ciaranmcnulty in #215
- Remove test - cucumber added an example with Rule which is not supported by @ciaranmcnulty in #239
- Add PHP 8.1 support by @javer in #242
- Fix main branch alias version by @mvorisek in #244
New Contributors
- @simonhammes made their first contribution in #237
- @javer made their first contribution in #242
- @mvorisek made their first contribution in #244
Full Changelog: v4.8.0...v4.9.0
-
v4.8.004 Feb 2021Nothing published for this version
-
v4.7.304 Feb 2021Nothing published for this version
-
v4.7.203 Feb 2021Nothing published for this version
-
v4.7.126 Jan 2021Nothing published for this version
-
v4.7.024 Jan 2021Nothing published for this version
-
v4.6.217 Mar 2020Nothing published for this version
-
v4.6.127 Feb 2020Nothing published for this version
-
v4.6.016 Jan 2019Nothing published for this version
-
v4.5.130 Aug 2017Nothing published for this version
-
v4.5.030 Aug 2017Nothing published for this version
-
v4.4.530 Oct 2016Nothing published for this version
-
v4.4.418 Sep 2016Nothing published for this version
-
v4.4.318 Sep 2016Nothing published for this version
-
v4.4.203 Sep 2016Nothing published for this version
-
v4.4.130 Dec 2015Nothing published for this version
-
v4.4.029 Sep 2015Nothing published for this version
-
v4.3.006 Jun 2014Nothing published for this version
-
v4.2.106 Jun 2014Nothing published for this version
-
v4.2.027 May 2014Nothing published for this version
-
v4.1.325 May 2014Nothing published for this version
-
v4.1.214 May 2014Nothing published for this version
-
v4.1.105 May 2014Nothing published for this version
-
v4.1.020 Apr 2014Nothing published for this version
-
v4.0.005 Jan 2014Nothing published for this version
-
v3.1.304 Jan 2014Nothing published for this version
-
v3.1.201 Jan 2014Nothing published for this version
-
v3.1.131 Dec 2013Nothing published for this version
-
v3.1.031 Dec 2013Nothing published for this version
-
v3.0.501 Jan 2014Nothing published for this version
-
v3.0.431 Dec 2013Nothing published for this version
-
v3.0.315 Sep 2013Nothing published for this version
-
v3.0.214 Sep 2013Nothing published for this version
-
v3.0.114 Sep 2013Nothing published for this version
-
v3.0.014 Sep 2013Nothing published for this version
-
v2.3.515 Oct 2013Nothing published for this version
-
v2.3.411 Aug 2013Nothing published for this version
-
v2.3.311 Aug 2013Nothing published for this version
-
v2.3.211 Aug 2013Nothing published for this version
-
v2.3.110 Aug 2013Nothing published for this version
-
v2.3.004 Aug 2013Nothing published for this version
-
v2.2.902 Mar 2013Nothing published for this version
-
v2.2.802 Mar 2013Nothing published for this version
-
v2.2.726 Jan 2013Nothing published for this version
-
v2.2.626 Jan 2013Nothing published for this version
-
v2.2.526 Sep 2012Nothing published for this version
-
v2.2.403 Aug 2012Nothing published for this version
-
v2.2.303 Aug 2012Nothing published for this version
-
v2.2.201 Jul 2012Nothing published for this version
-
v2.2.104 May 2012Nothing published for this version
-
v2.2.003 May 2012Nothing published for this version