CHANGELOG.md

# Changelog

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

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.2.1] - 2026-04-23

### Fixed

- ExDoc warnings for missing `LICENSE` and `CLAUDE.md` references in the
  README. `LICENSE` and `CHANGELOG.md` are now in `docs: [extras: ...]` so
  they render on hexdocs; the README links to `CLAUDE.md` on GitHub
  (project-internal convention, not useful to package consumers).
- ExDoc now configures `:source_url` and `:source_ref`, so code references
  in the generated docs link back to the tagged version on GitHub.

## [0.2.0] - 2026-04-23

### Added

- `mix cucumber.init` as a dedicated task (extracted from `mix cucumber --init`).
- `mix cucumber.gen.feature NAME` generates an empty feature file.
- `mix cucumber.gen.steps NAME` generates a step definition module.
- `.formatter.exs` exports `locals_without_parens` for all DSL and hook
  macros. Consumers add `import_deps: [:cucumberex]` to their
  `.formatter.exs` to avoid `mix format` mangling step definitions.

### Changed

- **Breaking:** `mix cucumber --init` is removed; use `mix cucumber.init`.
  This is the only breaking change versus 0.1.0.

### Fixed

- README hook examples and phase table now use the actual macro names
  (`before_`, `after_`, `before_step_`, `after_step_`, `before_all_`,
  `after_all_`, `around_`).

## [0.1.0] - 2026-04-23

Initial release.

### Added

- **DSL** (`Cucumberex.DSL`): `given_/2`, `when_/2`, `then_/2`, `step/2` macros
  for registering step definitions against Cucumber Expressions or regular
  expressions. `pending/0` marks a step pending at runtime. `world_module/1`
  and `parameter_type/3` for scenario-scoped composition.
- **Hooks** (`Cucumberex.Hooks.DSL`): `before_/1,2`, `after_/1,2`,
  `before_step/1,2`, `after_step/1,2`, `before_all/0,1`, `after_all/0,1`,
  with optional tag expression filters.
- **Cucumber Expressions**: built-in `{int}`, `{float}`, `{word}`, `{string}`,
  `{bigdecimal}`, `{double}`, `{byte}`, `{short}`, `{long}` parameter types;
  custom types registered via `parameter_type/3`.
- **Gherkin**: full `Feature` / `Rule` / `Scenario` / `Background` /
  `Scenario Outline` / `Examples` support via `cucumber_gherkin`, including
  data tables and doc strings.
- **Data tables** (`Cucumberex.DataTable`): `raw/1`, `hashes/1`, `rows/1`,
  `rows_hash/1`, `symbolic_hashes/1`, `transpose/1`, `map_headers/2`,
  `map_column/3`, `diff!/2`, `verify_column!/2`, `verify_table_width!/2`.
- **Doc strings** (`Cucumberex.DocString`): multi-line step arguments with
  optional media type; implements `String.Chars`.
- **Tag expressions** (`Cucumberex.Filter.TagExpression`): `and`, `or`, `not`,
  and parenthesized grouping. Also `Cucumberex.Filter.NameFilter` (substring
  / regex) and `Cucumberex.Filter.LineFilter` (`file:line` targeting).
- **Formatters** (`Cucumberex.Formatter`): GenServer-based behaviour with
  built-in `Pretty`, `Progress`, `JSON`, `HTML`, `JUnit`, and `Rerun`.
- **Event bus** (`Cucumberex.Events.Bus`): broadcasts `TestRunStarted`,
  `TestRunFinished`, `FeatureLoaded`, `TestCaseStarted`, `TestCaseFinished`,
  `TestStepStarted`, `TestStepFinished`, `HookStarted`, `HookFinished`,
  `UndefinedStep`, `AmbiguousStep`. `drain/1` provides a sync barrier for
  shutdown.
- **Runner** (`Cucumberex.Runner`): filter by tag / name / line, order
  (`:defined`, `:random`, `:reverse`), retry failed scenarios, fail-fast,
  WIP mode, dry run, strict mode for undefined / pending / both.
- **Configuration** (`Cucumberex.Config.Loader`): layered precedence —
  defaults, `mix.exs` config, `cucumber.yml` profile, CLI args (highest).
- **Mix task** (`mix cucumber`): CLI with short and long option forms;
  `--init` scaffolds a project; `--version`; `--i18n-languages` /
  `--i18n-keywords` surface Gherkin's language support.
- **World** (`Cucumberex.World`): scenario-isolated state map with optional
  global factory via `Cucumberex.World.Registry`.
- **Snippets** (`Cucumberex.StepDefinition.Snippet`): undefined-step
  skeletons in Cucumber Expression or regexp form.
- **Tooling**: `mix format`, `mix credo --strict` (clean), `mix dialyzer`
  (clean), 78 doctests + 31 unit tests.

[Unreleased]: https://github.com/jeffreybaird/cucumberex/compare/v0.2.1...HEAD
[0.2.1]: https://github.com/jeffreybaird/cucumberex/compare/v0.2.0...v0.2.1
[0.2.0]: https://github.com/jeffreybaird/cucumberex/compare/v0.1.0...v0.2.0
[0.1.0]: https://github.com/jeffreybaird/cucumberex/releases/tag/v0.1.0