ExGherkin

Elixir implementation for Gherkin-language.

Status: Feature-complete but still more documentation work required.

The purpose of this project is to be at least functionally equivalent to the official ruby implementation. In order to realize this, detailed tests have been implemented to compare the output generated by the official tools with the output generated in the tests.

This project is intentionally coined in its own dedicated repo to facilitate others; such as white_bread and cabbage, to leverage this parser and benefit from multi-language support and other features.

Overview

Most likely your visit to this repo was prompted by your usage of the package ex_cucumber. In such a case, then the main things you would want from this repo are:

Configuration

import Config
gherkin_languages = "gherkin-languages"

config :ex_gherkin,
  file: %{
    # to be downloaded. Serves as input for mix task: `mix gherkin_languages`
    source: "#{gherkin_languages}.json",

    # to be generated with the mix task: `mix gherkin_languages`
    resource: "#{gherkin_languages}.few.terms"
  },
  # e.g. a word with several meanings depending on the context for `Given`, `When`, `Then`, `And`, `But`
  homonyms: ["Агар ", "* ", "अनी ", "Tha ", "Þá ", "Ða ", "Þa "],

  # This is only beneficial for development purposes and can be skipped
  debug: %{
    tokenizer: false,
    prepare: false,
    parser: false,
    format_message: false,
    parser_raise: false
  }

Below this point are more arcane details that would mainly interest maintainers and those who want to use this library directly to parse feature-files.

Tools

  1. Mix tasks:
    1. mix gherkin_languages:
      • input: gherkin-languages.json
      • output: gherkin-languages.terms
      • supply variety of options to control:
        • which subset of languages desired
        • homonyms
    2. mix ast_ndjson:
      • input: *.feature
      • output: *.feature.ast.ndjson
      • dependency: gherkin-executable(see below)
  2. generate-tokens:
    • input: *.feature
    • output: *.feature.tokens
    • dependency: gherkin-executable(see below)

The dependency gherkin-executable referred to above can be installed by:

API

"""
Feature: Minimal

  Scenario: minimalistic
    Given the minimalism

"""
|> ExGherkin.prepare
|> ExGherkin.run
[path: "path_to.feature"]
|> ExGherkin.prepare
|> ExGherkin.run

For fine granular control, there are two parts:

  1. Scanner.tokenize/1,2 to tokenize the feature file. This leverages gherkin-languages.terms to provide i18n-support. This file is reproducible with the aid of the mix-task briefly docummented above, e.g.: mix gherkin_languages. Using this task, one can use a subset of what is contained under gherkin-languages.json and/or to even incorporate one's own domain- language specific keywords to denote Given, When, Then etc. An example of this is the file: gherkin-languages.few.terms which was primarily introduced to bring the compile-time of this project down. Scanner.tokenize/1,2effectively iterates over this file, generating functions that pattern-match i18n-support.

  2. Parser.run/1 to convert the tokens obtained into AST-tree. Leverages yecc parser under the hood.

Kindly consult the test-files for more detailed usage.

Road Forward