Files
23cm/vendor/behat/gherkin/CHANGELOG.md
2026-01-25 18:18:09 +08:00

25 KiB
Raw Blame History

Change Log

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

This project follows the [Behat release and version support policies] (https://docs.behat.org/en/latest/releases.html).

4.16.1 - 2025-12-08

Fixed

  • Reinstate support for tag filter expressions without a leading @ (e.g. wip&&~slow instead 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.

4.16.0 - 2025-12-05

Changed

  • Further improvements to parser parity when the experimental gherkin-32 compatibility mode is enabled:
    • Parse descriptions (instead of multiline titles) for all describable nodes by @acoulton in #361
    • Unescape escaped delimiters within doc strings by @stof in #393
    • Retain the @ prefix when parsing tags by @acoulton in #400
    • Trim unicode padding from table cells by @stof in #405

Fixed

  • Fix the implementation of the default dialect for the keywords provider by @stof in #404

Internal

  • Add Stringable to 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

4.15.0 - 2025-11-05

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 resultant FeatureNode::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 GherkinCompatibilityMode to control how gherkin files are parsed. In the default legacy mode, there is no change to parsing. In the new experimental gherkin-32 mode, 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
    • \n literals in table cells will be parsed as newlines by @stof in #359 and #391
  • Improved translations for ru (Russian) and af (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/gherkin version 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

4.14.0 - 2025-05-23

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 Scenario and Scenario Outline as synonyms depending on the presence (or not) of an Examples: keyword. by @acoulton in #316 and #324
    • Do not throw on some unexpected Feature / Language tags by @acoulton in #323
    • Do not throw on .feature file that does not contain a Feature by @acoulton in #340
    • Ignore content after table right-hand | (instead of throwing) by @acoulton in #341
  • 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::parseFile API 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

4.13.0 - 2025-05-06

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 the i18n.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) and ml (Malayalam) from cucumber/gherkin in #306
  • Improved translations / whitespace for ga (Irish), it (Italian), ja (Japanese), ka (Georgian) and ko (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

4.12.0 - 2025-02-26

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 the i18n.php file 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

4.11.0 - 2024-12-06

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() and ScenarioNode::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, and ExampleNode::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

4.10.0 / 2024-10-19

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

  • Fix exception when filter string is empty thanks to @magikid in #251

Internal

  • Sync teststuite with Cucumber 24.1.0
  • Fix PHPUnit 10 deprecation messages
  • A lot of great CI work by @heiglandreas and @jrfnl

4.9.0 / 2021-10-12

4.6.2 / 2020-03-17

  • Fixed issues due to incorrect cache key

4.6.1 / 2020-02-27

  • Fix AZ translations
  • Correctly filter features, now that the base path is correctly set

4.6.0 / 2019-01-16

  • Updated translations (including 'Example' as synonym for 'Scenario' in en)

4.5.1 / 2017-08-30

  • Fix regression in PathsFilter

4.5.0 / 2017-08-30

  • Sync i18n with Cucumber Gherkin
  • Drop support for HHVM tests on Travis
  • Add TableNode::fromList() method (thanks @TravisCarden)
  • Add ExampleNode::getOutlineTitle() method (thanks @duxet)
  • Use realpath, so the feature receives the cwd prefixed (thanks @glennunipro)
  • Explicitly handle non-two-dimensional arrays in TableNode (thanks @TravisCarden)
  • Fix to line/linefilter scenario runs which take relative paths to files (thanks @generalconsensus)

4.4.5 / 2016-10-30

  • Fix partial paths matching in PathsFilter

4.4.4 / 2016-09-18

  • Provide clearer exception for non-writeable cache directories

4.4.3 / 2016-09-18

  • Ensure we reset tags between features

4.4.2 / 2016-09-03

  • Sync 18n with gherkin 3

4.4.1 / 2015-12-30

  • Ensure keywords are trimmed when syncing translations
  • Sync 18n with cucumber

4.4.0 / 2015-09-19

  • Added validation enforcing that all rows of a TableNode have the same number of columns
  • Added TableNode::getColumn to get a column from the table
  • Sync 18n with cucumber

4.3.0 / 2014-06-06

  • Added setFilters(array) method to Gherkin class
  • Added NarrativeFilter for non-english RoleFilter lovers

4.2.1 / 2014-06-06

  • Fix parsing of features without line feed at the end

4.2.0 / 2014-05-27

  • Added getKeyword() and getKeywordType() methods to StepNode, deprecated getType(). Thanks to @kibao

4.1.3 / 2014-05-25

  • Properly handle tables with rows terminating in whitespace

4.1.2 / 2014-05-14

  • Handle case where Gherkin cache is broken

4.1.1 / 2014-05-05

  • Fixed the compatibility with PHP 5.6-beta by avoiding to use the broken PHP array function
  • The YamlFileLoader no longer extend from ArrayLoader but from AbstractFileLoader

4.1.0 / 2014-04-20

  • Fixed scenario tag filtering
  • Do not allow multiple multiline step arguments
  • Sync 18n with cucumber

4.0.0 / 2014-01-05

  • Changed the behavior when no loader can be found for the resource. Instead of throwing an exception, the Gherkin class now returns an empty array.

3.1.3 / 2014-01-04

  • Dropped the dependency on the Symfony Finder by using SPL iterators directly
  • Added testing on HHVM on Travis. HHVM is officially supported (previous release was actually already compatible)

3.1.2 / 2014-01-01

  • All paths passed to PathsFilter are converted using realpath

3.1.1 / 2013-12-31

  • Add ComplexFilterInterace that has complex behavior for scenarios and requires to pass feature too
  • TagFilter is an instance of a ComplexFilterInterace now

3.1.0 / 2013-12-31

  • Example node is a scenario
  • Nodes do not have uprefs (memory usage fix)
  • Scenario filters do not depend on feature nodes

3.0.5 / 2014-01-01

  • All paths passed to PathsFilter are converted using realpath

3.0.4 / 2013-12-31

  • TableNode is now traversable using foreach
  • All possibly thrown exceptions implement Gherkin\Exception interface
  • Sync i18n with cucumber

3.0.3 / 2013-09-15

  • Extend ExampleNode with additional methods

3.0.2 / 2013-09-14

  • Extract KeywordNodeInterface and ScenarioLikeInterface
  • Add getIndex() methods to scenarios, outlines, steps and examples
  • Throw proper exception for fractured node tree

3.0.1 / 2013-09-14

  • Use versioned subfolder in FileCache

3.0.0 / 2013-09-14

  • A lot of optimizations in Parser and Lexer
  • Node tree is now immutable by nature (no setters)
  • Example nodes are now part of the node tree. They are lazily generated by Outline node
  • Sync with latest cucumber i18n

2.3.4 / 2013-08-11

  • Fix leaks in memory cache

2.3.3 / 2013-08-11

  • Fix encoding bug introduced with previous release
  • Sync i18n with cucumber

2.3.2 / 2013-08-11

  • Explicitly use utf8 encoding

2.3.1 / 2013-08-10

  • Support an prefix with RoleFilter

2.3.0 / 2013-08-04

  • Add RoleFilter
  • Add PathsFilter
  • Add MemoryCache

2.2.9 / 2013-03-02

  • Fix dependency version requirement

2.2.8 / 2013-03-02

  • Features filtering behavior change. Now emptified (by filtering) features that do not match filter themselves are removed from resultset.
  • Small potential bug fix in TableNode

2.2.7 / 2013-01-27

  • Fixed bug in i18n syncing script
  • Resynced Gherkin i18n

2.2.6 / 2013-01-26

  • Support long row hashes in tables (see)
  • Synced Gherkin i18n

2.2.5 / 2012-09-26

  • Fixed issue with loading empty features
  • Synced Gherkin i18n

2.2.4 / 2012-08-03

  • Fixed exception message for "no loader found"

2.2.3 / 2012-08-03

  • Fixed minor loader bug with empty base path
  • Synced Gherkin i18n

2.2.2 / 2012-07-01

  • Added ability to filter outline scenarios by line and range filters
  • Synced Gherkin i18n
  • Refactored table parser to read row line numbers too

2.2.1 / 2012-05-04

  • Fixed StepNode getLanguage() and getFile()

2.2.0 / 2012-05-03

  • Features freeze after parsing
  • Implemented GherkinDumper (@Halleck45)
  • Synced i18n with Cucumber
  • Updated inline documentation

2.1.1 / 2012-03-09

  • Fixed caching bug, where isFresh() always returned false

2.1.0 / 2012-03-09

  • Added parser caching layer
  • Added support for table delimiter escaping (use \| for that)
  • Added LineRangeFilter (thanks @headrevision)
  • Synced i18n dictionary with cucumber/gherkin

2.0.2 / 2012-02-04

  • Synced i18n dictionary with cucumber/gherkin

2.0.1 / 2012-01-26

  • Fixed issue about parsing features without indentation

2.0.0 / 2012-01-19

  • Background titles support
  • Correct parsing of titles/descriptions (hirarchy lexing)
  • Migration to the cucumber/gherkin i18n dictionary
  • Speed optimizations
  • Refactored KeywordsDumper
  • New loaders
  • Bugfixes

1.1.4 / 2012-01-08

  • Read feature description even if it looks like a step

1.1.3 / 2011-12-14

  • Removed file loading routines from Parser (fixes is_file() issue on some systems - thanks @flodocteurklein)

1.1.2 / 2011-12-01

  • Updated spanish trasnaltion (@anbotero)
  • Integration with Composer and Travis CI

1.1.1 / 2011-07-29

  • Updated pt language step types (@danielcsgomes)
  • Updated vendors

1.1.0 / 2011-07-16

  • Return all tags, including inherited in Scenario::getTags()
  • New Feature::getOwnTags() and Scenario::getOwnTags() method added, which returns only own tags

1.0.8 / 2011-06-29

  • Fixed comments parsing. You cant have comments at the end of a line # like this

    But you can still have comments at the beginning of a line

1.0.7 / 2011-06-28

  • Added getRaw() method to PyStringNode
  • Updated vendors

1.0.6 / 2011-06-17

  • Updated vendors

1.0.5 / 2011-06-10

  • Fixed bug, introduced with 1.0.4 - hash in PyStrings

1.0.4 / 2011-06-10

  • Fixed inability to comment pystrings

1.0.3 / 2011-04-21

  • Fixed introduced with 1.0.2 pystring parsing bug

1.0.2 / 2011-04-18

  • Fixed bugs in text with comments parsing

1.0.1 / 2011-04-01

  • Updated vendors

1.0.0 / 2011-03-08

  • Updated vendors

1.0.0RC2 / 2011-02-25

  • Windows support
  • Missing phpunit config

1.0.0RC1 / 2011-02-15

  • Huge optimizations to Lexer & Parser
  • Additional loaders (Yaml, Array, Directory)
  • Filters (Tag, Name, Line)
  • Code refactoring
  • Nodes optimizations
  • Additional tests for exceptions and translations
  • Keywords dumper

0.2.0 / 2011-01-05

  • New Parser & Lexer (based on AST)
  • New verbose parsing exception handling
  • New translation mechanics
  • 47 brand new translations (see i18n)
  • Full test suite for everything from AST nodes to translations