From 1cc2ef0153603c5e51818b59ff6d632238491226 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 8 Nov 2022 13:28:44 +0100 Subject: [PATCH] Setup building and releasing with Github Actions (#3) With Github Actions each language is build and tested independently from the others. This significantly releases the complexity of the build environment needed. Additionally, for the same reason, code generation is no longer included in the build process. Rather all generated files are checked in. Two seperate make command exists to copy gherkin-languages.json and generate parsers using Berp. --- .github/renovate.json | 18 + .github/workflows/release-cpan.yaml | 20 + .github/workflows/release-github.yaml | 18 + .github/workflows/release-go.yml | 27 + .github/workflows/release-hex.yaml | 28 + .github/workflows/release-mvn.yml | 25 + .github/workflows/release-npm.yml | 24 + .github/workflows/release-nuget.yaml | 22 + .github/workflows/release-php.yaml | 21 + .github/workflows/release-rubygem.yml | 21 + .github/workflows/test-c.yml | 22 + .github/workflows/test-codegen.yml | 41 + .github/workflows/test-dart.yml | 25 + .github/workflows/test-dotnet.yml | 28 + .github/workflows/test-elixir.yml | 37 + .github/workflows/test-go.yml | 46 + .github/workflows/test-java.yml | 46 + .github/workflows/test-javascript.yml | 46 + .github/workflows/test-perl.yml | 33 + .github/workflows/test-php.yml | 58 + .github/workflows/test-python.yml | 48 + .github/workflows/test-ruby.yml | 41 + .gitignore | 1 + .rsync | 1 - CONTRIBUTING.md | 124 +- Makefile | 66 +- README.md | 33 +- RELEASING.md | 1 + c/.github/ISSUE_TEMPLATE.md | 5 - c/.github/PULL_REQUEST_TEMPLATE.md | 5 - c/.rsync | 5 - c/.subrepo | 1 - c/CONTRIBUTING.md | 7 +- c/LICENSE | 21 - c/Makefile | 29 +- c/README.md | 4 +- c/default.mk | 41 - c/gherkin-languages.json | 3741 ------------------ dart/CONTRIBUTING.md | 2 - dart/LICENSE | 21 - dart/Makefile | 30 + dart/README.md | 2 - dart/assets/gherkin-languages.json | 192 +- dart/gherkin.berp | 38 - default.mk | 89 - dotnet/.github/ISSUE_TEMPLATE.md | 5 - dotnet/.github/PULL_REQUEST_TEMPLATE.md | 5 - dotnet/.rsync | 5 - dotnet/.subrepo | 1 - dotnet/CONTRIBUTING.md | 4 +- dotnet/Gherkin/Gherkin.csproj | 4 +- dotnet/LICENSE | 21 - dotnet/Makefile | 85 +- dotnet/README.md | 4 +- dotnet/default.mk | 77 - dotnet/gherkin.berp | 38 - dotnet/scripts/update-version | 15 - elixir/.github/ISSUE_TEMPLATE.md | 5 - elixir/.github/PULL_REQUEST_TEMPLATE.md | 5 - elixir/.gitignore | 1 + elixir/.rsync | 5 - elixir/LICENSE | 21 - elixir/Makefile | 43 +- elixir/README.md | 2 +- elixir/default.mk | 79 - elixir/gherkin-elixir.razor | 3 - elixir/lib/gherkin/parser.ex | 3 - elixir/mix.exs | 3 +- elixir/mix.lock | 3 +- elixir/resources/gherkin.berp | 38 - generate_dialects.js | 40 - go/.github/ISSUE_TEMPLATE.md | 5 - go/.github/PULL_REQUEST_TEMPLATE.md | 5 - go/.rsync | 5 - go/.subrepo | 1 - go/.whitesource | 15 - go/LICENSE | 21 - go/Makefile | 129 +- go/README.md | 4 +- go/default.mk | 162 - go/dialects_builtin.go | 588 ++- go/dialects_builtin.go.jq | 55 +- go/gherkin-languages.json | 3741 ------------------ go/gherkin.berp | 38 - go/go.mod | 2 +- go/go.sum | 3 +- go/parser.go.razor | 1 - go/scripts/github-release | 21 - java/.github/ISSUE_TEMPLATE.md | 5 - java/.github/PULL_REQUEST_TEMPLATE.md | 5 - java/.rsync | 4 - java/.subrepo | 1 - java/CONTRIBUTING.md | 10 +- java/LICENSE | 21 - java/Makefile | 69 +- java/default.mk | 77 - java/gherkin.berp | 38 - java/maven-versions-rules.xml | 9 - java/scripts/check-jar.sh | 24 - java/scripts/post-release.sh | 21 - java/scripts/set_version_ranges.rb | 12 - javascript/.github/ISSUE_TEMPLATE.md | 5 - javascript/.github/PULL_REQUEST_TEMPLATE.md | 5 - javascript/.gitignore | 1 - javascript/.npmignore | 1 - javascript/.rsync | 5 - javascript/.subrepo | 1 - javascript/LICENSE | 21 - javascript/Makefile | 65 +- javascript/README.md | 6 +- javascript/default.mk | 87 - javascript/gherkin-javascript.razor | 1 + javascript/gherkin.berp | 38 - javascript/package-lock.json | 2112 ++++++++++ javascript/package.json | 14 +- javascript/tsconfig.build-cjs.json | 7 + javascript/tsconfig.build-esm.json | 8 + javascript/tsconfig.build.json | 15 +- javascript/tsconfig.esm.json | 14 + javascript/tsconfig.json | 22 +- objective-c/.github/ISSUE_TEMPLATE.md | 5 - objective-c/.github/PULL_REQUEST_TEMPLATE.md | 5 - objective-c/.rsync | 5 - objective-c/.subrepo | 1 - objective-c/LICENSE | 21 - objective-c/Makefile | 11 +- objective-c/default.mk | 16 - objective-c/gherkin.berp | 38 - perl/.github/ISSUE_TEMPLATE.md | 5 - perl/.github/PULL_REQUEST_TEMPLATE.md | 5 - perl/.rsync | 5 - perl/.subrepo | 1 - perl/Makefile | 101 +- perl/bin/gherkin | 2 +- perl/default.mk | 97 - perl/dist.ini | 3 - perl/gherkin-languages.json | 3741 ------------------ perl/gherkin.berp | 38 - perl/helper-scripts/build_languages.pl | 4 +- perl/lib/Gherkin.pm | 2 +- php/.github/ISSUE_TEMPLATE.md | 5 - php/.github/PULL_REQUEST_TEMPLATE.md | 5 - php/.gitignore | 1 + php/.php-cs-fixer.php | 1 - php/.rsync | 5 - php/.subrepo | 1 - php/LICENSE | 21 - php/Makefile | 101 +- php/build/.gitignore | 1 - php/default.mk | 62 - php/gherkin-php.razor | 65 +- php/gherkin.berp | 38 - php/src-generated/Parser.php | 736 ++-- python/.github/ISSUE_TEMPLATE.md | 5 - python/.github/PULL_REQUEST_TEMPLATE.md | 5 - python/.rsync | 5 - python/.subrepo | 1 - python/LICENSE.txt | 21 - python/Makefile | 99 +- python/default.mk | 47 - python/gherkin.berp | 38 - python/gherkin/stream/source_events.py | 2 +- python/gherkin/token_scanner.py | 2 +- ruby/.github/ISSUE_TEMPLATE.md | 5 - ruby/.github/PULL_REQUEST_TEMPLATE.md | 5 - ruby/.gitignore | 2 +- ruby/.rsync | 5 - ruby/.subrepo | 1 - ruby/LICENSE | 21 - ruby/Makefile | 86 +- ruby/README.md | 2 +- ruby/cucumber-gherkin.gemspec | 6 +- ruby/default.mk | 93 - ruby/gherkin.berp | 38 - ruby/scripts/update-gemspec | 32 - 175 files changed, 4546 insertions(+), 14312 deletions(-) create mode 100644 .github/renovate.json create mode 100644 .github/workflows/release-cpan.yaml create mode 100644 .github/workflows/release-github.yaml create mode 100644 .github/workflows/release-go.yml create mode 100644 .github/workflows/release-hex.yaml create mode 100644 .github/workflows/release-mvn.yml create mode 100644 .github/workflows/release-npm.yml create mode 100644 .github/workflows/release-nuget.yaml create mode 100644 .github/workflows/release-php.yaml create mode 100644 .github/workflows/release-rubygem.yml create mode 100644 .github/workflows/test-c.yml create mode 100644 .github/workflows/test-codegen.yml create mode 100644 .github/workflows/test-dart.yml create mode 100644 .github/workflows/test-dotnet.yml create mode 100644 .github/workflows/test-elixir.yml create mode 100644 .github/workflows/test-go.yml create mode 100644 .github/workflows/test-java.yml create mode 100644 .github/workflows/test-javascript.yml create mode 100644 .github/workflows/test-perl.yml create mode 100644 .github/workflows/test-php.yml create mode 100644 .github/workflows/test-python.yml create mode 100644 .github/workflows/test-ruby.yml delete mode 100644 .rsync create mode 100644 RELEASING.md delete mode 100644 c/.github/ISSUE_TEMPLATE.md delete mode 100644 c/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 c/.rsync delete mode 100644 c/.subrepo delete mode 100644 c/LICENSE delete mode 100644 c/default.mk delete mode 100644 c/gherkin-languages.json delete mode 100644 dart/LICENSE create mode 100644 dart/Makefile delete mode 100644 dart/gherkin.berp delete mode 100644 default.mk delete mode 100644 dotnet/.github/ISSUE_TEMPLATE.md delete mode 100644 dotnet/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 dotnet/.rsync delete mode 100644 dotnet/.subrepo delete mode 100644 dotnet/LICENSE delete mode 100644 dotnet/default.mk delete mode 100644 dotnet/gherkin.berp delete mode 100755 dotnet/scripts/update-version delete mode 100644 elixir/.github/ISSUE_TEMPLATE.md delete mode 100644 elixir/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 elixir/.rsync delete mode 100644 elixir/LICENSE delete mode 100644 elixir/default.mk delete mode 100644 elixir/resources/gherkin.berp delete mode 100755 generate_dialects.js delete mode 100644 go/.github/ISSUE_TEMPLATE.md delete mode 100644 go/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 go/.rsync delete mode 100644 go/.subrepo delete mode 100644 go/.whitesource delete mode 100644 go/LICENSE delete mode 100644 go/default.mk delete mode 100644 go/gherkin-languages.json delete mode 100644 go/gherkin.berp delete mode 100755 go/scripts/github-release delete mode 100644 java/.github/ISSUE_TEMPLATE.md delete mode 100644 java/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 java/.rsync delete mode 100644 java/.subrepo delete mode 100644 java/LICENSE delete mode 100644 java/default.mk delete mode 100644 java/gherkin.berp delete mode 100644 java/maven-versions-rules.xml delete mode 100755 java/scripts/check-jar.sh delete mode 100755 java/scripts/post-release.sh delete mode 100644 java/scripts/set_version_ranges.rb delete mode 100644 javascript/.github/ISSUE_TEMPLATE.md delete mode 100644 javascript/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 javascript/.rsync delete mode 100644 javascript/.subrepo delete mode 100644 javascript/LICENSE delete mode 100644 javascript/default.mk delete mode 100644 javascript/gherkin.berp create mode 100644 javascript/package-lock.json create mode 100644 javascript/tsconfig.build-cjs.json create mode 100644 javascript/tsconfig.build-esm.json create mode 100644 javascript/tsconfig.esm.json delete mode 100644 objective-c/.github/ISSUE_TEMPLATE.md delete mode 100644 objective-c/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 objective-c/.rsync delete mode 100644 objective-c/.subrepo delete mode 100644 objective-c/LICENSE delete mode 100644 objective-c/default.mk delete mode 100644 objective-c/gherkin.berp delete mode 100644 perl/.github/ISSUE_TEMPLATE.md delete mode 100644 perl/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 perl/.rsync delete mode 100644 perl/.subrepo delete mode 100644 perl/default.mk delete mode 100644 perl/gherkin-languages.json delete mode 100644 perl/gherkin.berp delete mode 100644 php/.github/ISSUE_TEMPLATE.md delete mode 100644 php/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 php/.rsync delete mode 100644 php/.subrepo delete mode 100644 php/LICENSE delete mode 100644 php/build/.gitignore delete mode 100644 php/default.mk delete mode 100644 php/gherkin.berp delete mode 100644 python/.github/ISSUE_TEMPLATE.md delete mode 100644 python/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 python/.rsync delete mode 100644 python/.subrepo delete mode 100644 python/LICENSE.txt delete mode 100644 python/default.mk delete mode 100644 python/gherkin.berp delete mode 100644 ruby/.github/ISSUE_TEMPLATE.md delete mode 100644 ruby/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 ruby/.rsync delete mode 100644 ruby/.subrepo delete mode 100644 ruby/LICENSE delete mode 100644 ruby/default.mk delete mode 100644 ruby/gherkin.berp delete mode 100755 ruby/scripts/update-gemspec diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 000000000..a42b3dc3e --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,18 @@ +{ + "extends": [ + "config:base", + ":preserveSemverRanges", + ":rebaseStalePrs", + ":disableDependencyDashboard" + ], + "labels": [":robot: dependencies"], + "prHourlyLimit": 0, + "packageRules": [ + { + "depTypeList": ["devDependencies", "dependencies"], + "updateTypes": ["minor", "patch"], + "automerge": true, + "automergeType": "branch" + } + ] +} diff --git a/.github/workflows/release-cpan.yaml b/.github/workflows/release-cpan.yaml new file mode 100644 index 000000000..a96e20e38 --- /dev/null +++ b/.github/workflows/release-cpan.yaml @@ -0,0 +1,20 @@ +name: Release Perl/CPAN + +on: + push: + branches: [release/*] + +jobs: + create-perl-release: + name: Publish to CPAN + runs-on: ubuntu-latest + environment: Release + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + - uses: cucumber/action-publish-cpan@v1.0.0 + with: + cpan-user: ${{ secrets.CPAN_USER }} + cpan-password: ${{ secrets.CPAN_PASSWORD }} + working-directory: 'perl' diff --git a/.github/workflows/release-github.yaml b/.github/workflows/release-github.yaml new file mode 100644 index 000000000..88b128a59 --- /dev/null +++ b/.github/workflows/release-github.yaml @@ -0,0 +1,18 @@ +name: Release GitHub + +on: + push: + branches: [release/*] + +jobs: + create-github-release: + name: Create GitHub Release and Git tag + runs-on: ubuntu-latest + environment: Release + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + - uses: cucumber/action-create-github-release@v1.1.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release-go.yml b/.github/workflows/release-go.yml new file mode 100644 index 000000000..3558f4f43 --- /dev/null +++ b/.github/workflows/release-go.yml @@ -0,0 +1,27 @@ +name: Release Go + +on: + push: + branches: [release/*] + +jobs: + read-version: + name: Read version to release + runs-on: ubuntu-latest + outputs: + version: ${{ steps.versions.outputs.changelog-latest-version }} + steps: + - uses: actions/checkout@v3 + - uses: cucumber/action-get-versions@v1.0.0 + id: versions + + publish-go: + name: Create go/v* tag + runs-on: ubuntu-latest + needs: read-version + steps: + - uses: actions/checkout@v3 + - name: Create git tag + run: | + git tag "go/v${{ needs.read-version.outputs.version }}" + git push --tags diff --git a/.github/workflows/release-hex.yaml b/.github/workflows/release-hex.yaml new file mode 100644 index 000000000..a25b78435 --- /dev/null +++ b/.github/workflows/release-hex.yaml @@ -0,0 +1,28 @@ +name: Release Elixir hex package + +on: + push: + branches: [release/*] + +jobs: + create-hex-release: + name: Publish to hex.pm + runs-on: ubuntu-latest + environment: Release + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + + - uses: erlef/setup-beam@v1 + with: + otp-version: '22.2' + elixir-version: '1.10.x' + + - name: Install Protoc + uses: arduino/setup-protoc@v1 + + - uses: cucumber/action-publish-hex@v1.0.0 + with: + hex-api-key: ${{ secrets.HEX_API_KEY }} + working-directory: 'elixir' diff --git a/.github/workflows/release-mvn.yml b/.github/workflows/release-mvn.yml new file mode 100644 index 000000000..50f5ba889 --- /dev/null +++ b/.github/workflows/release-mvn.yml @@ -0,0 +1,25 @@ +name: Release Maven + +on: + push: + branches: [release/*] + +jobs: + publish-mvn: + name: Publish Maven Package + runs-on: ubuntu-latest + environment: Release + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '11' + cache: 'maven' + - uses: cucumber/action-publish-mvn@v2.0.0 + with: + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }} + nexus-username: cukebot + nexus-password: ${{ secrets.SONATYPE_PASSWORD }} + working-directory: java diff --git a/.github/workflows/release-npm.yml b/.github/workflows/release-npm.yml new file mode 100644 index 000000000..b027774af --- /dev/null +++ b/.github/workflows/release-npm.yml @@ -0,0 +1,24 @@ +name: Release NPM + +on: + push: + branches: [release/*] + +jobs: + publish-npm: + name: Publish NPM module + runs-on: ubuntu-latest + environment: Release + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '16' + cache: 'npm' + cache-dependency-path: javascript/package-lock.json + - run: npm install-test + working-directory: javascript + - uses: cucumber/action-publish-npm@v1.1.0 + with: + npm-token: ${{ secrets.NPM_TOKEN }} + working-directory: javascript diff --git a/.github/workflows/release-nuget.yaml b/.github/workflows/release-nuget.yaml new file mode 100644 index 000000000..0c8da484f --- /dev/null +++ b/.github/workflows/release-nuget.yaml @@ -0,0 +1,22 @@ +name: Release NuGet + +on: + push: + branches: + - "release/*" + +jobs: + publish-nuget: + name: Publish package to NuGet.org + runs-on: ubuntu-latest + environment: Release + steps: + - uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 6.0.x + - uses: cucumber/action-publish-nuget@v1.0.0 + with: + nuget-api-key: ${{ secrets.NUGET_API_KEY }} + working-directory: "dotnet" diff --git a/.github/workflows/release-php.yaml b/.github/workflows/release-php.yaml new file mode 100644 index 000000000..e7d5de980 --- /dev/null +++ b/.github/workflows/release-php.yaml @@ -0,0 +1,21 @@ +name: Release PHP + +on: + push: + branches: [release/*] + +jobs: + create-php-release: + name: Publish to PHP subrepo + runs-on: ubuntu-latest + environment: Release + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: '0' + - uses: cucumber/action-publish-subrepo@v1.1.0 + with: + working-directory: php + github-token: ${{ secrets.CUKEBOT_GITHUB_TOKEN }} diff --git a/.github/workflows/release-rubygem.yml b/.github/workflows/release-rubygem.yml new file mode 100644 index 000000000..54149566c --- /dev/null +++ b/.github/workflows/release-rubygem.yml @@ -0,0 +1,21 @@ +name: Release RubyGems + +on: + push: + branches: [release/*] + +jobs: + publish-rubygem: + name: Publish Ruby Gem + runs-on: ubuntu-latest + environment: Release + steps: + - uses: actions/checkout@v3 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.0.2' + bundler-cache: true + - uses: cucumber/action-publish-rubygem@v1.0.0 + with: + rubygems_api_key: ${{ secrets.RUBYGEMS_API_KEY }} + working_directory: ruby diff --git a/.github/workflows/test-c.yml b/.github/workflows/test-c.yml new file mode 100644 index 000000000..795099f6d --- /dev/null +++ b/.github/workflows/test-c.yml @@ -0,0 +1,22 @@ +name: test-c + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-c: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: run make + run: make + working-directory: c diff --git a/.github/workflows/test-codegen.yml b/.github/workflows/test-codegen.yml new file mode 100644 index 000000000..978047870 --- /dev/null +++ b/.github/workflows/test-codegen.yml @@ -0,0 +1,41 @@ +name: test-codegen + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-codegen: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: '5.0.x' + + - name: install berp + run: | + dotnet tool update Berp --version 1.3.0 --tool-path ~/bin + echo "~/bin" >> $GITHUB_PATH + + - name: generate code for all languages + run: | + make clean-gherkin-languages + make copy-gherkin-languages + + make clean-generate + make generate + + - name: check the repo is still clean after generation + run: | + git status --porcelain + git diff HEAD + [ -z "$(git status --porcelain)" ] diff --git a/.github/workflows/test-dart.yml b/.github/workflows/test-dart.yml new file mode 100644 index 000000000..6842c1866 --- /dev/null +++ b/.github/workflows/test-dart.yml @@ -0,0 +1,25 @@ +name: test-dart + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-dart: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: install dart + uses: dart-lang/setup-dart@v1.3 + + - name: run tests + run: dart test + working-directory: dart diff --git a/.github/workflows/test-dotnet.yml b/.github/workflows/test-dotnet.yml new file mode 100644 index 000000000..918990bc8 --- /dev/null +++ b/.github/workflows/test-dotnet.yml @@ -0,0 +1,28 @@ +name: test-dotnet + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-dotnet: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: '5.0.x' + + - run: dotnet test + working-directory: dotnet + + - name: run acceptance tests + run: make acceptance + working-directory: dotnet diff --git a/.github/workflows/test-elixir.yml b/.github/workflows/test-elixir.yml new file mode 100644 index 000000000..8330f1d8b --- /dev/null +++ b/.github/workflows/test-elixir.yml @@ -0,0 +1,37 @@ +name: test-elixir + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-elixir: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - uses: erlef/setup-beam@v1 + with: + otp-version: '22.2' + elixir-version: '1.10.x' + + - name: Install Protoc + uses: arduino/setup-protoc@v1 + + - run: | + mix local.hex --force + mix deps.get + working-directory: elixir + + - run: mix test + working-directory: elixir + + - name: run acceptance tests + run: make acceptance + working-directory: elixir diff --git a/.github/workflows/test-go.yml b/.github/workflows/test-go.yml new file mode 100644 index 000000000..0810c7bbc --- /dev/null +++ b/.github/workflows/test-go.yml @@ -0,0 +1,46 @@ +name: test-go + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-go: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + go: ['1.13.x', '1.18.x'] + include: +# Integration tests don't work on Windows, reason unknown +# - os: windows-latest +# go: '1.18.x' + - os: macos-latest + go: '1.18.x' + + steps: + - uses: actions/checkout@v3 + - name: Set up Go + uses: actions/setup-go@v3 + with: + go-version: ${{ matrix.go }} + + - name: lint + working-directory: go + run: gofmt -w . + + - name: test + working-directory: go + run: go test --v ./... + + - name: run acceptance tests + run: make acceptance + working-directory: go \ No newline at end of file diff --git a/.github/workflows/test-java.yml b/.github/workflows/test-java.yml new file mode 100644 index 000000000..478126a42 --- /dev/null +++ b/.github/workflows/test-java.yml @@ -0,0 +1,46 @@ +name: test-java + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-java: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + java: ["11", "17"] + include: +# Integration tests don't work on windows, classpath must be seperated with a ';' instead. +# - os: windows-latest +# java: "17" + - os: macos-latest + java: "17" + + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-java@v3 + with: + distribution: "temurin" + java-version: ${{ matrix.java }} + cache: "maven" + + - run: mvn install + working-directory: java + + - run: mvn test + working-directory: java + + - name: run acceptance tests + run: make acceptance + working-directory: java diff --git a/.github/workflows/test-javascript.yml b/.github/workflows/test-javascript.yml new file mode 100644 index 000000000..f25c02eac --- /dev/null +++ b/.github/workflows/test-javascript.yml @@ -0,0 +1,46 @@ +name: test-javascript + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-javascript: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + node-version: ["16.x", "17.x", "18.x"] + include: + - os: windows-latest + node-version: "18.x" + - os: macos-latest + node-version: "18.x" + + steps: + - name: set git core.autocrlf to 'input' + run: git config --global core.autocrlf input + + - uses: actions/checkout@v3 + + - name: with Node.js ${{ matrix.node-version }} on ${{ matrix.os }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: "npm" + cache-dependency-path: javascript/package-lock.json + + - run: npm install-ci-test + working-directory: javascript + + - name: run acceptance tests + run: make acceptance + working-directory: javascript \ No newline at end of file diff --git a/.github/workflows/test-perl.yml b/.github/workflows/test-perl.yml new file mode 100644 index 000000000..b9b7ae8dc --- /dev/null +++ b/.github/workflows/test-perl.yml @@ -0,0 +1,33 @@ +name: test-perl + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-perl: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: install cpanm and multiple modules + uses: perl-actions/install-with-cpanm@v1 + with: + cpanfile: "perl/cpanfile" + + - name: run tests + run: | + prove -l + AUTHOR_TESTS=1 prove -l + working-directory: perl + + - name: run acceptance tests + run: make acceptance + working-directory: perl \ No newline at end of file diff --git a/.github/workflows/test-php.yml b/.github/workflows/test-php.yml new file mode 100644 index 000000000..12e5afb6c --- /dev/null +++ b/.github/workflows/test-php.yml @@ -0,0 +1,58 @@ +name: test-php + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-php: + runs-on: ubuntu-latest + strategy: + matrix: + php: ['8.1'] + composer-mode: ['low-deps', 'high-deps'] + + steps: + - uses: actions/checkout@v3 + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "${{ matrix.php }}" + + - name: Discover composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-dir)" + working-directory: php + + - name: Cache composer + uses: actions/cache@v3 + with: + path: "${{ steps.composer-cache.outputs.dir }}" + key: composer + + - name: Install dependencies + working-directory: php + run: | + if [[ "${{ matrix.composer-mode }}" = "low-deps" ]]; then + composer update --prefer-lowest + else + composer update + fi + + - name: Run tests + working-directory: php + run: | + vendor/bin/php-cs-fixer --dry-run --diff fix + vendor/bin/psalm --no-cache + vendor/bin/phpunit + + - name: run acceptance tests + run: make acceptance + working-directory: php \ No newline at end of file diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml new file mode 100644 index 000000000..c8ac79321 --- /dev/null +++ b/.github/workflows/test-python.yml @@ -0,0 +1,48 @@ +name: test-python +defaults: + run: + working-directory: python + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + +jobs: + test-python: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + python-version: [ '3.x', '2.x', 'pypy-3.8', 'pypy-2.7' ] + # DISABLED: python-version: [ '3.x', '2.x' ] + # include: + # - os: macos-latest + # python-version: '3.x' + + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + architecture: x64 + - name: Show Python version + run: python --version + - name: Install Python package dependencies + run: | + python -m pip install -U pip setuptools wheel + pip install -U -r requirements.txt + pip install -e . + - name: Run tests + run: pytest + + - name: run acceptance tests + run: make acceptance + working-directory: python \ No newline at end of file diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml new file mode 100644 index 000000000..68d71a8a7 --- /dev/null +++ b/.github/workflows/test-ruby.yml @@ -0,0 +1,41 @@ +name: test-ruby + +on: + push: + branches: + - main + - renovate/** + pull_request: + branches: + - main + workflow_call: + +jobs: + test-ruby: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + ruby: ["2.6", "2.7", "3.0", "3.1"] + include: + - os: macos-latest + ruby: "3.1" + + steps: + - uses: actions/checkout@v3 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + working-directory: ruby + + - run: bundle exec rake + working-directory: ruby + + - name: run acceptance tests + run: make acceptance + working-directory: ruby \ No newline at end of file diff --git a/.gitignore b/.gitignore index 58feb1d1f..ef6bb9350 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ dotnet/.vs/* dotnet/output +*.iml \ No newline at end of file diff --git a/.rsync b/.rsync deleted file mode 100644 index ea5a5de24..000000000 --- a/.rsync +++ /dev/null @@ -1 +0,0 @@ -../.templates/default.mk default.mk diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b3cb8cdb8..b7d4691ff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,74 +1,69 @@ # Contributing to Gherkin -Gherkin is implemented in several different languages. Each implementation is -in a separate sub directory in this repository. +Gherkin is implemented in several languages. Each implementation is +in a separate subdirectory in this repository. -A copy of each implementation also exists in a separate git repository, -under `https://github.com/cucumber/gherkin-DIRNAME`. +## Project organisation -The code in each of those git repositories can be built and used independently. -This is useful for people who only want to *use* Gherkin without *contributing* -to Gherkin. +Each subdirectory is a stand-alone project using the preferred tools for +that language, you can find more detailed information in `/CONTRIBUTING.md`. -Gherkin *contributors* should clone *this* repository. This will automatically get -you a copy of the files in the various `gherkin-*` repositories. +Each gherkin implementation depends on two common files. + * `gherkin-langauges.json` containing translations of the Gherkin Keywords + * `gherkin.berp` from which a parser is generated. -When you're done, just create a pull request against *this* repository. +To reduce the complexity of common tasks: copying and/or generating +localisations and generating the parser is done separately from building each project. -## Building +## Contributing changes + +* Create a feature branch for your change. +* Don't lump unrelated changes together. +* If you change code, please make sure all implementations are changed accordingly. + * If you don't to do this, we might reject your patch because the burden to keep parsers in sync is now on us. + +## Generating parsers Prerequisites: -* .NET 5.0 (also needed for non-dotnet, to run `berp` to generate parsers) -* JDK - * Maven -* Node.js or IO.js -* Ruby -* Python (both python2 & python3) -* Go +* .NET 5.0 (to run `berp` to generate parsers) +* `berp` (install with `dotnet tool update Berp --version 1.3.0 --tool-path /usr/bin` ) * `make` * `jq` (>= 1.4 for `--sort-keys` option) * `diff` * `git` -* Build the `messages` project (at minimum for the language(s) that you'll be working on in the `gherkin` project) -With all this installed, just run `make` from the root directory. +With all this installed use Make: -Notes: -* on Ubuntu you need to create a symbolic link from `/usr/bin/nodejs` to `/usr/bin/node` +``` +make generate +make clean-generate +``` -## Contributing changes +## Adding or updating an i18n language -* Create a feature branch for your change. -* Don't lump unrelated changes together. -* If you change code, please make sure all implementations are changed accordingly. - * If you don't to do this, we might reject your patch because the burden to keep parsers in sync is now on us. +Prerequisites: -## Adding or updating an i18n language +* `make` +* `jq` (>= 1.4 for `--sort-keys` option) +* `git` 1) Edit `gherkin-langauges.json`. 2) Distribute the changes to the different parser implementations, this requires `make`, `jq`, `diff`, but no compiler/interpreters: ``` -source ../scripts/functions.sh -rsync_files -make clean -make +make clean-gherkin-languages +make copy-gherkin-languages ``` 3) Make a pull request with the changed files. -## Building individual parsers - -It's possible to build the parser for a single language too. Please refer to -`CONTRIBUTING.md` files in each language directory for details. - ## Running tests -Each sub project has its own unit tests that are run during the build of that project. +Each subproject has its own unit tests that are run during the build of that project. -In addition to these tests, `make` will run acceptance tests that verify the output of: +In addition to these tests, `make acceptance` will run acceptance tests that verify the output of: * the scanner * the parser @@ -86,7 +81,7 @@ file, indicating that the acceptance tests passed. ## Consistency between implementations TL;DR anyone who only knows one of the supported programming languages should be -able to fix a bug or add a feature in all the other implementations. -Simply by +able to fix a bug or add a feature in all the other implementations. - By virtue of finding their way around a consistently organised codebase. As of May 2016 Gherkin is implemented in 8 languages. This number is likely to @@ -102,7 +97,7 @@ because I know where to find stuff since all implementations follow the same str If one implementation looks completely different, this becomes a huge burden that will slow everything down. -So for this reason, please don't start a new implementation that doesn't use Berp, +So for this reason, please don't start a new implementation that does not use Berp, or add a feature in one implementation without also doing it in all the other implementations. Don't refactor the code to follow some nice design pattern if it makes the code so different from the other implementations that it can no longer @@ -117,7 +112,7 @@ of the existing implementations. Now, modify the parts of the `Makefile` that generates the `Parser.x` file, referring to the `gherkin-x.razor` file you're about to create. -When you run `make` it should complain that `gherkin-x.razor` does not exist. +When you run `make generate` it should complain that `gherkin-x.razor` does not exist. Now, copy a `.razor` file from one of the other implementations. @@ -128,7 +123,7 @@ good), but writing a few during development might help you progress. You'll spend quite a bit of time fiddling with the `.razor` template to make it generate code that is syntactically correct. -When you get to that stage, `make` will run the acceptance tests, which iterate +When you get to that stage, `make clean acceptance` will run the acceptance tests, which iterate over all the `.feature` files under `../testdata`, passes them through your `bin/gherkin-generate-tokens` and `bin/gherkin-generate-ast` command-line programs, and compares the output using `diff`. @@ -138,45 +133,12 @@ pass! Then send us a pull-request :-) -And if you're stuck - please shoot an email to the *cukes-devs* Google Group -or find us on [Gitter](https://gitter.im/cucumber/gherkin). +And if you're stuck - please shoot message to the #commiters channel in the +[CucumberBDD Slack](https://cucumberbdd-slack-invite.herokuapp.com/) [direct link](https://cucumberbdd.slack.com/). ## Make a release -Start by modifying the version in all sub projects: - - echo "X.Y.Z" > VERSION - make update-version - git commit -m "Update VERSION to X.Y.Z" - -Releases are made from the various subtrees. Before you release, update the subtrees: - - make push-subtrees - -Next, clone each individual subtree repo (or `git pull -r origin master` if you've already done so) -in your working copy of each subtree, then follow the release guidelines -for each component in the respective `CONTRIBUTING.md` file. - -When all components are released, update the master repo: - - make pull-subtrees - -This might cause some trivial merge conflicts. If that happens, resolve them manually, -commit and pull subtrees again. - -Now, update `CHANGELOG.md` with the new release number and date, while keeping -a section for the upcoming changes. Also update the links at the bottom of the file. - -Then finally create a tag in this master repo and push. - - git commit -m "Release X.Y.Z" - git tag -a -m "Version X.Y.Z" vX.Y.Z - git push - git push --tags - make push-subtrees - -The last step might cause some conflicts. If that happens, force push the failing -subtree (see Troubleshooting section) and run `make push-subtrees` again. +See [RELEASING.md](./RELEASING.md) ## Verify all of Cucumber's i18n examples @@ -193,7 +155,7 @@ With the parser: ## Adding or changing good testdata -Test data for acceptance testing are available in the top-level `gherkin` directory in `testdata` +Test data for acceptance testing are available in the top-level `testdata` ### Approach 1 @@ -242,4 +204,4 @@ Test data for acceptance testing are available in the top-level `gherkin` direct 7) Inspect the generated `.feature.pickles.json` file manually to see if it's good. -8) Run `make` from the root directory to verify that all parsers parse it ok. +8) Run `make acceptance` from the root directory to verify that all parsers parse it ok. diff --git a/Makefile b/Makefile index 4b79aaaac..9e74f29cf 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,62 @@ -LANGUAGES ?= javascript go ruby java perl python dotnet php c -include default.mk +languages = c dart dotnet elixir go java javascript perl php python ruby -post-release: print-documentation-instructions +.DEFAULT_GOAL = help -print-documentation-instructions: - @echo -e "\033[0;34m*** Remember to update gherkin documentation. See: https://github.com/cucumber/docs/tree/main/layouts/shortcodes ***\033[0m" -.PHONY: print-documentation-instructions +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +acceptance: $(patsubst %,acceptance-%,$(languages)) ## Build acceptance test dir and compare results with reference for all supported languages +.PHONY: acceptance + +acceptance-%: % + cd $< && make acceptance +.PHONY: acceptance-% + +clean: $(patsubst %,clean-%,$(languages)) ## Remove all build artifacts and files generated by the acceptance tests for all supported languages +.PHONY: clean + +clean-%: % + cd $< && make clean +.PHONY: clean-% + +generate: $(patsubst %,generate-%,$(languages)) ## Generate parsers for all supported languages +.PHONY: generate + +generate-%: % + cd $< && make generate +.PHONY: generate-% + +clean-generate: $(patsubst %,clean-generate-%,$(languages)) ## Clean generated parsers for all supported languages +.PHONY: clean-generate + +clean-generate-%: % + cd $< && make clean-generate +.PHONY: clean-generate-% + +copy-gherkin-languages: $(patsubst %,copy-gherkin-languages-%,$(languages)) ## Copy gherkin-languages.json to all supported languages +.PHONY: copy-gherkin-languages + +copy-gherkin-languages-%: % + cd $< && make copy-gherkin-languages +.PHONY: generate-% + +clean-gherkin-languages: $(patsubst %,clean-gherkin-languages-%,$(languages)) ## Clean gherkin-languages.json +.PHONY: clean-gherkin-languages + +clean-gherkin-languages-%: % + cd $< && make clean-gherkin-languages +.PHONY: clean-gherkin-languages-% + +docker-run: ## Start a docker container with all languages and tools installed + [ -d "${HOME}/.m2/repository" ] || mkdir -p "${HOME}/.m2/repository" + docker run \ + --publish "6006:6006" \ + --volume "${shell pwd}":/app \ + --volume "${HOME}/.m2/repository":/home/cukebot/.m2/repository \ + --user 1000 \ + --rm \ + --interactive \ + --tty \ + cucumber/cucumber-build:0.13.0 \ + bash +.PHONY: \ No newline at end of file diff --git a/README.md b/README.md index 3824a17b2..9252ce1a4 100644 --- a/README.md +++ b/README.md @@ -4,26 +4,21 @@ Gherkin is a parser and compiler for the Gherkin language. Gherkin is currently implemented for the following platforms (in order of birthday): -- [.NET](https://github.com/cucumber/gherkin-dotnet) -- [Java](https://github.com/cucumber/gherkin-java) -- [JavaScript](https://github.com/cucumber/gherkin-javascript) -- [Ruby](https://github.com/cucumber/gherkin-ruby) -- [Go](https://github.com/cucumber/gherkin-go) -- [Python](https://github.com/cucumber/gherkin-python) -- [C](https://github.com/cucumber/common/tree/main/gherkin/c) -- [Objective-C](https://github.com/cucumber/gherkin-objective-c) -- [Perl](https://github.com/cucumber/gherkin-perl) -- [PHP](https://github.com/cucumber/gherkin-php) +- [.NET](./dotnet) +- [Java](./java) +- [JavaScript](./javascript) +- [Ruby](./ruby) +- [Go](./go) +- [Python](./python) +- [C](./c) +- [Objective-C](./objective-c) +- [Perl](./perl) +- [PHP](./php) See [`CONTRIBUTING.md`](CONTRIBUTING.md) if you want to contribute a parser for a new language. Our wish-list is (in no particular order): - Rust -- Elixir - -## Markdown with Gherkin - -See [Markdown with Gherkin](./MARKDOWN_WITH_GHERKIN.md). ## Usage @@ -205,7 +200,7 @@ design docs (which might be a little outdated, but mostly OK). The AST produced by the parser can be described with the following class diagram: -![](https://github.com/cucumber/common/blob/main/gherkin/docs/ast.png) +![](https://github.com/cucumber/gherkin/blob/main/docs/ast.png) Every class represents a node in the AST. Every node has a `Location` that describes the line number and column number in the input file. These numbers are 1-indexed. @@ -220,7 +215,7 @@ Each node in the JSON representation also has a `type` property with the name of the node type. You can see some examples in the -[testdata/good](https://github.com/cucumber/common/tree/main/gherkin/testdata/good) +[testdata/good](https://github.com/cucumber/gherkin/tree/main/testdata/good) directory. ### Pickles @@ -413,6 +408,10 @@ objects. `TestCase` objects link to user code such as Hooks and Step Definitions See [`CONTRIBUTING.md`](CONTRIBUTING.md) +## Markdown with Gherkin + +See [Markdown with Gherkin](./MARKDOWN_WITH_GHERKIN.md). + ## Projects using Gherkin - [cucumber-jvm](https://github.com/cucumber/cucumber-jvm) diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 000000000..71e0bb877 --- /dev/null +++ b/RELEASING.md @@ -0,0 +1 @@ +See [.github/RELEASING](https://github.com/cucumber/.github/blob/main/RELEASING.md). diff --git a/c/.github/ISSUE_TEMPLATE.md b/c/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/c/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/c/.github/PULL_REQUEST_TEMPLATE.md b/c/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/c/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/c/.rsync b/c/.rsync deleted file mode 100644 index 22fea1ff9..000000000 --- a/c/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../LICENSE LICENSE -../../.templates/github/ .github/ -../../.templates/c/ . -../gherkin.berp gherkin.berp -../gherkin-languages.json gherkin-languages.json diff --git a/c/.subrepo b/c/.subrepo deleted file mode 100644 index 299c6f43d..000000000 --- a/c/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-c diff --git a/c/CONTRIBUTING.md b/c/CONTRIBUTING.md index 1285676f9..76fc88ab6 100644 --- a/c/CONTRIBUTING.md +++ b/c/CONTRIBUTING.md @@ -1,10 +1,7 @@ -Please read [CONTRIBUTING](https://github.com/cucumber/common/blob/main/CONTRIBUTING.md) first. -You should clone the [cucumber/common](https://github.com/cucumber/common) repo if you want -to contribute. +Please read [CONTRIBUTING](https://github.com/cucumber/gherkin/blob/main/CONTRIBUTING.md) first. ## Run tests ### Using make -Just run `make` from this directory. - +Run `make` from this directory. diff --git a/c/LICENSE b/c/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/c/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/c/Makefile b/c/Makefile index a1a91f575..bed0ddd73 100644 --- a/c/Makefile +++ b/c/Makefile @@ -1,4 +1,4 @@ -include default.mk +SHELL := /usr/bin/env bash GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature") BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature") @@ -28,10 +28,24 @@ endif default: .compared .PHONY: default +acceptance: .compared ## Build acceptance test dir and compare results with reference + .compared: .built $(TOKENS) $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) .run touch $@ -.built: ./include/rule_type.h src/parser.c src/dialect.c $(SRC_FILES) src/Makefile LICENSE +generate: ./include/rule_type.h src/parser.c src/dialect.c ## Generate gherkin parser files + +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f ./include/rule_type.h src/parser.c src/dialect.c +.PHONY: clean-generate + +copy-gherkin-languages: ## Copy gherkin-languages.json and/or generate derived files + echo "Nothing to do" + +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + echo "Nothing to do" + +.built: generate $(SRC_FILES) src/Makefile $(CC) --version cd src; $(MAKE) touch $@ @@ -41,10 +55,6 @@ clean: cd src; $(MAKE) $@ .PHONY: clean -clobber: clean - rm -rf ./include/rule_type.h src/parser.c src/dialect.c -.PHONY: clobber - cli: ./include/rule_type.h src/parser.c src/dialect.c $(SRC_FILES) src/Makefile cd src; $(MAKE) CC=$(CC) $@ .PHONY: libs @@ -61,13 +71,17 @@ libs_so: ./include/rule_type.h src/parser.c src/dialect.c $(SRC_FILES) src/Makef $(RUN_GHERKIN) $(GOOD_FEATURE_FILES) | jq . > /dev/null touch $@ +define berp-generate-parser = +berp -g ../gherkin.berp -t $< -o $@ --noBOM +endef + ./include/rule_type.h: gherkin-c-rule-type.razor gherkin.berp $(berp-generate-parser) src/parser.c: gherkin-c-parser.razor gherkin.berp $(berp-generate-parser) -src/dialect.c: gherkin-languages.json dialect.c.jq +src/dialect.c: ../gherkin-languages.json dialect.c.jq cat $< | jq -f dialect.c.jq -r -c > $@ acceptance/testdata/%.feature.tokens: ../testdata/%.feature ../testdata/%.feature.tokens $(GHERKIN_GENERATE_TOKENS) @@ -95,4 +109,3 @@ acceptance/testdata/%.feature.source.ndjson: ../testdata/%.feature ../testdata/% mkdir -p $(@D) $(RUN_GHERKIN) --no-ast --no-pickles $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) - diff --git a/c/README.md b/c/README.md index 9905cb98a..d5f053801 100644 --- a/c/README.md +++ b/c/README.md @@ -135,9 +135,9 @@ cmake_minimum_required(VERSION 3.7) project(gherkincsample) include(ExternalProject) ExternalProject_Add(gherkin_proj - GIT_REPOSITORY https://github.com/cucumber/common.git + GIT_REPOSITORY https://github.com/cucumber/gherkin.git GIT_TAG - SOURCE_SUBDIR gherkin/c + SOURCE_SUBDIR c ) ... ``` diff --git a/c/default.mk b/c/default.mk deleted file mode 100644 index f80ce5913..000000000 --- a/c/default.mk +++ /dev/null @@ -1,41 +0,0 @@ -SHELL := /usr/bin/env bash -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -# Make "default" the default make target -default: -.PHONY: default - -update-dependencies: - # no-op -.PHONY: update-dependencies - -pre-release: update-dependencies clean default -.PHONY: pre-release - -update-version: -ifdef NEW_VERSION - sed -i "s/[0-9]*\.[0-9]*\.[0-9]*/$(NEW_VERSION)/" VERSION -else - @echo -e "\033[0;NEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-version - -publish: - # no-op -.PHONY: publish - -post-release: - # no-op -.PHONY: post-release - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/c/gherkin-languages.json b/c/gherkin-languages.json deleted file mode 100644 index 279a4d89a..000000000 --- a/c/gherkin-languages.json +++ /dev/null @@ -1,3741 +0,0 @@ -{ - "af": { - "and": [ - "* ", - "En " - ], - "background": [ - "Agtergrond" - ], - "but": [ - "* ", - "Maar " - ], - "examples": [ - "Voorbeelde" - ], - "feature": [ - "Funksie", - "Besigheid Behoefte", - "Vermoë" - ], - "given": [ - "* ", - "Gegewe " - ], - "name": "Afrikaans", - "native": "Afrikaans", - "rule": [ - "Regel" - ], - "scenario": [ - "Voorbeeld", - "Situasie" - ], - "scenarioOutline": [ - "Situasie Uiteensetting" - ], - "then": [ - "* ", - "Dan " - ], - "when": [ - "* ", - "Wanneer " - ] - }, - "am": { - "and": [ - "* ", - "Եվ " - ], - "background": [ - "Կոնտեքստ" - ], - "but": [ - "* ", - "Բայց " - ], - "examples": [ - "Օրինակներ" - ], - "feature": [ - "Ֆունկցիոնալություն", - "Հատկություն" - ], - "given": [ - "* ", - "Դիցուք " - ], - "name": "Armenian", - "native": "հայերեն", - "rule": [ - "Rule" - ], - "scenario": [ - "Օրինակ", - "Սցենար" - ], - "scenarioOutline": [ - "Սցենարի կառուցվացքը" - ], - "then": [ - "* ", - "Ապա " - ], - "when": [ - "* ", - "Եթե ", - "Երբ " - ] - }, - "an": { - "and": [ - "* ", - "Y ", - "E " - ], - "background": [ - "Antecedents" - ], - "but": [ - "* ", - "Pero " - ], - "examples": [ - "Eixemplos" - ], - "feature": [ - "Caracteristica" - ], - "given": [ - "* ", - "Dau ", - "Dada ", - "Daus ", - "Dadas " - ], - "name": "Aragonese", - "native": "Aragonés", - "rule": [ - "Rule" - ], - "scenario": [ - "Eixemplo", - "Caso" - ], - "scenarioOutline": [ - "Esquema del caso" - ], - "then": [ - "* ", - "Alavez ", - "Allora ", - "Antonces " - ], - "when": [ - "* ", - "Cuan " - ] - }, - "ar": { - "and": [ - "* ", - "و " - ], - "background": [ - "الخلفية" - ], - "but": [ - "* ", - "لكن " - ], - "examples": [ - "امثلة" - ], - "feature": [ - "خاصية" - ], - "given": [ - "* ", - "بفرض " - ], - "name": "Arabic", - "native": "العربية", - "rule": [ - "Rule" - ], - "scenario": [ - "مثال", - "سيناريو" - ], - "scenarioOutline": [ - "سيناريو مخطط" - ], - "then": [ - "* ", - "اذاً ", - "ثم " - ], - "when": [ - "* ", - "متى ", - "عندما " - ] - }, - "ast": { - "and": [ - "* ", - "Y ", - "Ya " - ], - "background": [ - "Antecedentes" - ], - "but": [ - "* ", - "Peru " - ], - "examples": [ - "Exemplos" - ], - "feature": [ - "Carauterística" - ], - "given": [ - "* ", - "Dáu ", - "Dada ", - "Daos ", - "Daes " - ], - "name": "Asturian", - "native": "asturianu", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemplo", - "Casu" - ], - "scenarioOutline": [ - "Esbozu del casu" - ], - "then": [ - "* ", - "Entós " - ], - "when": [ - "* ", - "Cuando " - ] - }, - "az": { - "and": [ - "* ", - "Və ", - "Həm " - ], - "background": [ - "Keçmiş", - "Kontekst" - ], - "but": [ - "* ", - "Amma ", - "Ancaq " - ], - "examples": [ - "Nümunələr" - ], - "feature": [ - "Özəllik" - ], - "given": [ - "* ", - "Tutaq ki ", - "Verilir " - ], - "name": "Azerbaijani", - "native": "Azərbaycanca", - "rule": [ - "Rule" - ], - "scenario": [ - "Nümunə", - "Ssenari" - ], - "scenarioOutline": [ - "Ssenarinin strukturu" - ], - "then": [ - "* ", - "O halda " - ], - "when": [ - "* ", - "Əgər ", - "Nə vaxt ki " - ] - }, - "bg": { - "and": [ - "* ", - "И " - ], - "background": [ - "Предистория" - ], - "but": [ - "* ", - "Но " - ], - "examples": [ - "Примери" - ], - "feature": [ - "Функционалност" - ], - "given": [ - "* ", - "Дадено " - ], - "name": "Bulgarian", - "native": "български", - "rule": [ - "Правило" - ], - "scenario": [ - "Пример", - "Сценарий" - ], - "scenarioOutline": [ - "Рамка на сценарий" - ], - "then": [ - "* ", - "То " - ], - "when": [ - "* ", - "Когато " - ] - }, - "bm": { - "and": [ - "* ", - "Dan " - ], - "background": [ - "Latar Belakang" - ], - "but": [ - "* ", - "Tetapi ", - "Tapi " - ], - "examples": [ - "Contoh" - ], - "feature": [ - "Fungsi" - ], - "given": [ - "* ", - "Diberi ", - "Bagi " - ], - "name": "Malay", - "native": "Bahasa Melayu", - "rule": [ - "Rule" - ], - "scenario": [ - "Senario", - "Situasi", - "Keadaan" - ], - "scenarioOutline": [ - "Kerangka Senario", - "Kerangka Situasi", - "Kerangka Keadaan", - "Garis Panduan Senario" - ], - "then": [ - "* ", - "Maka ", - "Kemudian " - ], - "when": [ - "* ", - "Apabila " - ] - }, - "bs": { - "and": [ - "* ", - "I ", - "A " - ], - "background": [ - "Pozadina" - ], - "but": [ - "* ", - "Ali " - ], - "examples": [ - "Primjeri" - ], - "feature": [ - "Karakteristika" - ], - "given": [ - "* ", - "Dato " - ], - "name": "Bosnian", - "native": "Bosanski", - "rule": [ - "Rule" - ], - "scenario": [ - "Primjer", - "Scenariju", - "Scenario" - ], - "scenarioOutline": [ - "Scenariju-obris", - "Scenario-outline" - ], - "then": [ - "* ", - "Zatim " - ], - "when": [ - "* ", - "Kada " - ] - }, - "ca": { - "and": [ - "* ", - "I " - ], - "background": [ - "Rerefons", - "Antecedents" - ], - "but": [ - "* ", - "Però " - ], - "examples": [ - "Exemples" - ], - "feature": [ - "Característica", - "Funcionalitat" - ], - "given": [ - "* ", - "Donat ", - "Donada ", - "Atès ", - "Atesa " - ], - "name": "Catalan", - "native": "català", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemple", - "Escenari" - ], - "scenarioOutline": [ - "Esquema de l'escenari" - ], - "then": [ - "* ", - "Aleshores ", - "Cal " - ], - "when": [ - "* ", - "Quan " - ] - }, - "cs": { - "and": [ - "* ", - "A také ", - "A " - ], - "background": [ - "Pozadí", - "Kontext" - ], - "but": [ - "* ", - "Ale " - ], - "examples": [ - "Příklady" - ], - "feature": [ - "Požadavek" - ], - "given": [ - "* ", - "Pokud ", - "Za předpokladu " - ], - "name": "Czech", - "native": "Česky", - "rule": [ - "Pravidlo" - ], - "scenario": [ - "Příklad", - "Scénář" - ], - "scenarioOutline": [ - "Náčrt Scénáře", - "Osnova scénáře" - ], - "then": [ - "* ", - "Pak " - ], - "when": [ - "* ", - "Když " - ] - }, - "cy-GB": { - "and": [ - "* ", - "A " - ], - "background": [ - "Cefndir" - ], - "but": [ - "* ", - "Ond " - ], - "examples": [ - "Enghreifftiau" - ], - "feature": [ - "Arwedd" - ], - "given": [ - "* ", - "Anrhegedig a " - ], - "name": "Welsh", - "native": "Cymraeg", - "rule": [ - "Rule" - ], - "scenario": [ - "Enghraifft", - "Scenario" - ], - "scenarioOutline": [ - "Scenario Amlinellol" - ], - "then": [ - "* ", - "Yna " - ], - "when": [ - "* ", - "Pryd " - ] - }, - "da": { - "and": [ - "* ", - "Og " - ], - "background": [ - "Baggrund" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Eksempler" - ], - "feature": [ - "Egenskab" - ], - "given": [ - "* ", - "Givet " - ], - "name": "Danish", - "native": "dansk", - "rule": [ - "Rule" - ], - "scenario": [ - "Eksempel", - "Scenarie" - ], - "scenarioOutline": [ - "Abstrakt Scenario" - ], - "then": [ - "* ", - "Så " - ], - "when": [ - "* ", - "Når " - ] - }, - "de": { - "and": [ - "* ", - "Und " - ], - "background": [ - "Grundlage", - "Hintergrund", - "Voraussetzungen", - "Vorbedingungen" - ], - "but": [ - "* ", - "Aber " - ], - "examples": [ - "Beispiele" - ], - "feature": [ - "Funktionalität", - "Funktion" - ], - "given": [ - "* ", - "Angenommen ", - "Gegeben sei ", - "Gegeben seien " - ], - "name": "German", - "native": "Deutsch", - "rule": [ - "Rule", - "Regel" - ], - "scenario": [ - "Beispiel", - "Szenario" - ], - "scenarioOutline": [ - "Szenariogrundriss", - "Szenarien" - ], - "then": [ - "* ", - "Dann " - ], - "when": [ - "* ", - "Wenn " - ] - }, - "el": { - "and": [ - "* ", - "Και " - ], - "background": [ - "Υπόβαθρο" - ], - "but": [ - "* ", - "Αλλά " - ], - "examples": [ - "Παραδείγματα", - "Σενάρια" - ], - "feature": [ - "Δυνατότητα", - "Λειτουργία" - ], - "given": [ - "* ", - "Δεδομένου " - ], - "name": "Greek", - "native": "Ελληνικά", - "rule": [ - "Rule" - ], - "scenario": [ - "Παράδειγμα", - "Σενάριο" - ], - "scenarioOutline": [ - "Περιγραφή Σεναρίου", - "Περίγραμμα Σεναρίου" - ], - "then": [ - "* ", - "Τότε " - ], - "when": [ - "* ", - "Όταν " - ] - }, - "em": { - "and": [ - "* ", - "😂" - ], - "background": [ - "💤" - ], - "but": [ - "* ", - "😔" - ], - "examples": [ - "📓" - ], - "feature": [ - "📚" - ], - "given": [ - "* ", - "😐" - ], - "name": "Emoji", - "native": "😀", - "rule": [ - "Rule" - ], - "scenario": [ - "🥒", - "📕" - ], - "scenarioOutline": [ - "📖" - ], - "then": [ - "* ", - "🙏" - ], - "when": [ - "* ", - "🎬" - ] - }, - "en": { - "and": [ - "* ", - "And " - ], - "background": [ - "Background" - ], - "but": [ - "* ", - "But " - ], - "examples": [ - "Examples", - "Scenarios" - ], - "feature": [ - "Feature", - "Business Need", - "Ability" - ], - "given": [ - "* ", - "Given " - ], - "name": "English", - "native": "English", - "rule": [ - "Rule" - ], - "scenario": [ - "Example", - "Scenario" - ], - "scenarioOutline": [ - "Scenario Outline", - "Scenario Template" - ], - "then": [ - "* ", - "Then " - ], - "when": [ - "* ", - "When " - ] - }, - "en-Scouse": { - "and": [ - "* ", - "An " - ], - "background": [ - "Dis is what went down" - ], - "but": [ - "* ", - "Buh " - ], - "examples": [ - "Examples" - ], - "feature": [ - "Feature" - ], - "given": [ - "* ", - "Givun ", - "Youse know when youse got " - ], - "name": "Scouse", - "native": "Scouse", - "rule": [ - "Rule" - ], - "scenario": [ - "The thing of it is" - ], - "scenarioOutline": [ - "Wharrimean is" - ], - "then": [ - "* ", - "Dun ", - "Den youse gotta " - ], - "when": [ - "* ", - "Wun ", - "Youse know like when " - ] - }, - "en-au": { - "and": [ - "* ", - "Too right " - ], - "background": [ - "First off" - ], - "but": [ - "* ", - "Yeah nah " - ], - "examples": [ - "You'll wanna" - ], - "feature": [ - "Pretty much" - ], - "given": [ - "* ", - "Y'know " - ], - "name": "Australian", - "native": "Australian", - "rule": [ - "Rule" - ], - "scenario": [ - "Awww, look mate" - ], - "scenarioOutline": [ - "Reckon it's like" - ], - "then": [ - "* ", - "But at the end of the day I reckon " - ], - "when": [ - "* ", - "It's just unbelievable " - ] - }, - "en-lol": { - "and": [ - "* ", - "AN " - ], - "background": [ - "B4" - ], - "but": [ - "* ", - "BUT " - ], - "examples": [ - "EXAMPLZ" - ], - "feature": [ - "OH HAI" - ], - "given": [ - "* ", - "I CAN HAZ " - ], - "name": "LOLCAT", - "native": "LOLCAT", - "rule": [ - "Rule" - ], - "scenario": [ - "MISHUN" - ], - "scenarioOutline": [ - "MISHUN SRSLY" - ], - "then": [ - "* ", - "DEN " - ], - "when": [ - "* ", - "WEN " - ] - }, - "en-old": { - "and": [ - "* ", - "Ond ", - "7 " - ], - "background": [ - "Aer", - "Ær" - ], - "but": [ - "* ", - "Ac " - ], - "examples": [ - "Se the", - "Se þe", - "Se ðe" - ], - "feature": [ - "Hwaet", - "Hwæt" - ], - "given": [ - "* ", - "Thurh ", - "Þurh ", - "Ðurh " - ], - "name": "Old English", - "native": "Englisc", - "rule": [ - "Rule" - ], - "scenario": [ - "Swa" - ], - "scenarioOutline": [ - "Swa hwaer swa", - "Swa hwær swa" - ], - "then": [ - "* ", - "Tha ", - "Þa ", - "Ða ", - "Tha the ", - "Þa þe ", - "Ða ðe " - ], - "when": [ - "* ", - "Bæþsealf ", - "Bæþsealfa ", - "Bæþsealfe ", - "Ciricæw ", - "Ciricæwe ", - "Ciricæwa " - ] - }, - "en-pirate": { - "and": [ - "* ", - "Aye " - ], - "background": [ - "Yo-ho-ho" - ], - "but": [ - "* ", - "Avast! " - ], - "examples": [ - "Dead men tell no tales" - ], - "feature": [ - "Ahoy matey!" - ], - "given": [ - "* ", - "Gangway! " - ], - "name": "Pirate", - "native": "Pirate", - "rule": [ - "Rule" - ], - "scenario": [ - "Heave to" - ], - "scenarioOutline": [ - "Shiver me timbers" - ], - "then": [ - "* ", - "Let go and haul " - ], - "when": [ - "* ", - "Blimey! " - ] - }, - "en-tx": { - "and": [ - "Come hell or high water " - ], - "background": [ - "Lemme tell y'all a story" - ], - "but": [ - "Well now hold on, I'll you what " - ], - "examples": [ - "Now that's a story longer than a cattle drive in July" - ], - "feature": [ - "This ain’t my first rodeo", - "All gussied up" - ], - "given": [ - "Fixin' to ", - "All git out " - ], - "name": "Texas", - "native": "Texas", - "rule": [ - "Rule " - ], - "scenario": [ - "All hat and no cattle" - ], - "scenarioOutline": [ - "Serious as a snake bite", - "Busy as a hound in flea season" - ], - "then": [ - "There’s no tree but bears some fruit " - ], - "when": [ - "Quick out of the chute " - ] - }, - "eo": { - "and": [ - "* ", - "Kaj " - ], - "background": [ - "Fono" - ], - "but": [ - "* ", - "Sed " - ], - "examples": [ - "Ekzemploj" - ], - "feature": [ - "Trajto" - ], - "given": [ - "* ", - "Donitaĵo ", - "Komence " - ], - "name": "Esperanto", - "native": "Esperanto", - "rule": [ - "Rule" - ], - "scenario": [ - "Ekzemplo", - "Scenaro", - "Kazo" - ], - "scenarioOutline": [ - "Konturo de la scenaro", - "Skizo", - "Kazo-skizo" - ], - "then": [ - "* ", - "Do " - ], - "when": [ - "* ", - "Se " - ] - }, - "es": { - "and": [ - "* ", - "Y ", - "E " - ], - "background": [ - "Antecedentes" - ], - "but": [ - "* ", - "Pero " - ], - "examples": [ - "Ejemplos" - ], - "feature": [ - "Característica", - "Necesidad del negocio", - "Requisito" - ], - "given": [ - "* ", - "Dado ", - "Dada ", - "Dados ", - "Dadas " - ], - "name": "Spanish", - "native": "español", - "rule": [ - "Regla", - "Regla de negocio" - ], - "scenario": [ - "Ejemplo", - "Escenario" - ], - "scenarioOutline": [ - "Esquema del escenario" - ], - "then": [ - "* ", - "Entonces " - ], - "when": [ - "* ", - "Cuando " - ] - }, - "et": { - "and": [ - "* ", - "Ja " - ], - "background": [ - "Taust" - ], - "but": [ - "* ", - "Kuid " - ], - "examples": [ - "Juhtumid" - ], - "feature": [ - "Omadus" - ], - "given": [ - "* ", - "Eeldades " - ], - "name": "Estonian", - "native": "eesti keel", - "rule": [ - "Reegel" - ], - "scenario": [ - "Juhtum", - "Stsenaarium" - ], - "scenarioOutline": [ - "Raamjuhtum", - "Raamstsenaarium" - ], - "then": [ - "* ", - "Siis " - ], - "when": [ - "* ", - "Kui " - ] - }, - "fa": { - "and": [ - "* ", - "و " - ], - "background": [ - "زمینه" - ], - "but": [ - "* ", - "اما " - ], - "examples": [ - "نمونه ها" - ], - "feature": [ - "وِیژگی" - ], - "given": [ - "* ", - "با فرض " - ], - "name": "Persian", - "native": "فارسی", - "rule": [ - "Rule" - ], - "scenario": [ - "مثال", - "سناریو" - ], - "scenarioOutline": [ - "الگوی سناریو" - ], - "then": [ - "* ", - "آنگاه " - ], - "when": [ - "* ", - "هنگامی " - ] - }, - "fi": { - "and": [ - "* ", - "Ja " - ], - "background": [ - "Tausta" - ], - "but": [ - "* ", - "Mutta " - ], - "examples": [ - "Tapaukset" - ], - "feature": [ - "Ominaisuus" - ], - "given": [ - "* ", - "Oletetaan " - ], - "name": "Finnish", - "native": "suomi", - "rule": [ - "Rule" - ], - "scenario": [ - "Tapaus" - ], - "scenarioOutline": [ - "Tapausaihio" - ], - "then": [ - "* ", - "Niin " - ], - "when": [ - "* ", - "Kun " - ] - }, - "fr": { - "and": [ - "* ", - "Et que ", - "Et qu'", - "Et " - ], - "background": [ - "Contexte" - ], - "but": [ - "* ", - "Mais que ", - "Mais qu'", - "Mais " - ], - "examples": [ - "Exemples" - ], - "feature": [ - "Fonctionnalité" - ], - "given": [ - "* ", - "Soit ", - "Sachant que ", - "Sachant qu'", - "Sachant ", - "Etant donné que ", - "Etant donné qu'", - "Etant donné ", - "Etant donnée ", - "Etant donnés ", - "Etant données ", - "Étant donné que ", - "Étant donné qu'", - "Étant donné ", - "Étant donnée ", - "Étant donnés ", - "Étant données " - ], - "name": "French", - "native": "français", - "rule": [ - "Règle" - ], - "scenario": [ - "Exemple", - "Scénario" - ], - "scenarioOutline": [ - "Plan du scénario", - "Plan du Scénario" - ], - "then": [ - "* ", - "Alors ", - "Donc " - ], - "when": [ - "* ", - "Quand ", - "Lorsque ", - "Lorsqu'" - ] - }, - "ga": { - "and": [ - "* ", - "Agus" - ], - "background": [ - "Cúlra" - ], - "but": [ - "* ", - "Ach" - ], - "examples": [ - "Samplaí" - ], - "feature": [ - "Gné" - ], - "given": [ - "* ", - "Cuir i gcás go", - "Cuir i gcás nach", - "Cuir i gcás gur", - "Cuir i gcás nár" - ], - "name": "Irish", - "native": "Gaeilge", - "rule": [ - "Rule" - ], - "scenario": [ - "Sampla", - "Cás" - ], - "scenarioOutline": [ - "Cás Achomair" - ], - "then": [ - "* ", - "Ansin" - ], - "when": [ - "* ", - "Nuair a", - "Nuair nach", - "Nuair ba", - "Nuair nár" - ] - }, - "gj": { - "and": [ - "* ", - "અને " - ], - "background": [ - "બેકગ્રાઉન્ડ" - ], - "but": [ - "* ", - "પણ " - ], - "examples": [ - "ઉદાહરણો" - ], - "feature": [ - "લક્ષણ", - "વ્યાપાર જરૂર", - "ક્ષમતા" - ], - "given": [ - "* ", - "આપેલ છે " - ], - "name": "Gujarati", - "native": "ગુજરાતી", - "rule": [ - "Rule" - ], - "scenario": [ - "ઉદાહરણ", - "સ્થિતિ" - ], - "scenarioOutline": [ - "પરિદ્દશ્ય રૂપરેખા", - "પરિદ્દશ્ય ઢાંચો" - ], - "then": [ - "* ", - "પછી " - ], - "when": [ - "* ", - "ક્યારે " - ] - }, - "gl": { - "and": [ - "* ", - "E " - ], - "background": [ - "Contexto" - ], - "but": [ - "* ", - "Mais ", - "Pero " - ], - "examples": [ - "Exemplos" - ], - "feature": [ - "Característica" - ], - "given": [ - "* ", - "Dado ", - "Dada ", - "Dados ", - "Dadas " - ], - "name": "Galician", - "native": "galego", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemplo", - "Escenario" - ], - "scenarioOutline": [ - "Esbozo do escenario" - ], - "then": [ - "* ", - "Entón ", - "Logo " - ], - "when": [ - "* ", - "Cando " - ] - }, - "he": { - "and": [ - "* ", - "וגם " - ], - "background": [ - "רקע" - ], - "but": [ - "* ", - "אבל " - ], - "examples": [ - "דוגמאות" - ], - "feature": [ - "תכונה" - ], - "given": [ - "* ", - "בהינתן " - ], - "name": "Hebrew", - "native": "עברית", - "rule": [ - "כלל" - ], - "scenario": [ - "דוגמא", - "תרחיש" - ], - "scenarioOutline": [ - "תבנית תרחיש" - ], - "then": [ - "* ", - "אז ", - "אזי " - ], - "when": [ - "* ", - "כאשר " - ] - }, - "hi": { - "and": [ - "* ", - "और ", - "तथा " - ], - "background": [ - "पृष्ठभूमि" - ], - "but": [ - "* ", - "पर ", - "परन्तु ", - "किन्तु " - ], - "examples": [ - "उदाहरण" - ], - "feature": [ - "रूप लेख" - ], - "given": [ - "* ", - "अगर ", - "यदि ", - "चूंकि " - ], - "name": "Hindi", - "native": "हिंदी", - "rule": [ - "नियम" - ], - "scenario": [ - "परिदृश्य" - ], - "scenarioOutline": [ - "परिदृश्य रूपरेखा" - ], - "then": [ - "* ", - "तब ", - "तदा " - ], - "when": [ - "* ", - "जब ", - "कदा " - ] - }, - "hr": { - "and": [ - "* ", - "I " - ], - "background": [ - "Pozadina" - ], - "but": [ - "* ", - "Ali " - ], - "examples": [ - "Primjeri", - "Scenariji" - ], - "feature": [ - "Osobina", - "Mogućnost", - "Mogucnost" - ], - "given": [ - "* ", - "Zadan ", - "Zadani ", - "Zadano ", - "Ukoliko " - ], - "name": "Croatian", - "native": "hrvatski", - "rule": [ - "Rule" - ], - "scenario": [ - "Primjer", - "Scenarij" - ], - "scenarioOutline": [ - "Skica", - "Koncept" - ], - "then": [ - "* ", - "Onda " - ], - "when": [ - "* ", - "Kada ", - "Kad " - ] - }, - "ht": { - "and": [ - "* ", - "Ak ", - "Epi ", - "E " - ], - "background": [ - "Kontèks", - "Istorik" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Egzanp" - ], - "feature": [ - "Karakteristik", - "Mak", - "Fonksyonalite" - ], - "given": [ - "* ", - "Sipoze ", - "Sipoze ke ", - "Sipoze Ke " - ], - "name": "Creole", - "native": "kreyòl", - "rule": [ - "Rule" - ], - "scenario": [ - "Senaryo" - ], - "scenarioOutline": [ - "Plan senaryo", - "Plan Senaryo", - "Senaryo deskripsyon", - "Senaryo Deskripsyon", - "Dyagram senaryo", - "Dyagram Senaryo" - ], - "then": [ - "* ", - "Lè sa a ", - "Le sa a " - ], - "when": [ - "* ", - "Lè ", - "Le " - ] - }, - "hu": { - "and": [ - "* ", - "És " - ], - "background": [ - "Háttér" - ], - "but": [ - "* ", - "De " - ], - "examples": [ - "Példák" - ], - "feature": [ - "Jellemző" - ], - "given": [ - "* ", - "Amennyiben ", - "Adott " - ], - "name": "Hungarian", - "native": "magyar", - "rule": [ - "Szabály" - ], - "scenario": [ - "Példa", - "Forgatókönyv" - ], - "scenarioOutline": [ - "Forgatókönyv vázlat" - ], - "then": [ - "* ", - "Akkor " - ], - "when": [ - "* ", - "Majd ", - "Ha ", - "Amikor " - ] - }, - "id": { - "and": [ - "* ", - "Dan " - ], - "background": [ - "Dasar", - "Latar Belakang" - ], - "but": [ - "* ", - "Tapi ", - "Tetapi " - ], - "examples": [ - "Contoh", - "Misal" - ], - "feature": [ - "Fitur" - ], - "given": [ - "* ", - "Dengan ", - "Diketahui ", - "Diasumsikan ", - "Bila ", - "Jika " - ], - "name": "Indonesian", - "native": "Bahasa Indonesia", - "rule": [ - "Rule", - "Aturan" - ], - "scenario": [ - "Skenario" - ], - "scenarioOutline": [ - "Skenario konsep", - "Garis-Besar Skenario" - ], - "then": [ - "* ", - "Maka ", - "Kemudian " - ], - "when": [ - "* ", - "Ketika " - ] - }, - "is": { - "and": [ - "* ", - "Og " - ], - "background": [ - "Bakgrunnur" - ], - "but": [ - "* ", - "En " - ], - "examples": [ - "Dæmi", - "Atburðarásir" - ], - "feature": [ - "Eiginleiki" - ], - "given": [ - "* ", - "Ef " - ], - "name": "Icelandic", - "native": "Íslenska", - "rule": [ - "Rule" - ], - "scenario": [ - "Atburðarás" - ], - "scenarioOutline": [ - "Lýsing Atburðarásar", - "Lýsing Dæma" - ], - "then": [ - "* ", - "Þá " - ], - "when": [ - "* ", - "Þegar " - ] - }, - "it": { - "and": [ - "* ", - "E " - ], - "background": [ - "Contesto" - ], - "but": [ - "* ", - "Ma " - ], - "examples": [ - "Esempi" - ], - "feature": [ - "Funzionalità", - "Esigenza di Business", - "Abilità" - ], - "given": [ - "* ", - "Dato ", - "Data ", - "Dati ", - "Date " - ], - "name": "Italian", - "native": "italiano", - "rule": [ - "Regola" - ], - "scenario": [ - "Esempio", - "Scenario" - ], - "scenarioOutline": [ - "Schema dello scenario" - ], - "then": [ - "* ", - "Allora " - ], - "when": [ - "* ", - "Quando " - ] - }, - "ja": { - "and": [ - "* ", - "且つ", - "かつ" - ], - "background": [ - "背景" - ], - "but": [ - "* ", - "然し", - "しかし", - "但し", - "ただし" - ], - "examples": [ - "例", - "サンプル" - ], - "feature": [ - "フィーチャ", - "機能" - ], - "given": [ - "* ", - "前提" - ], - "name": "Japanese", - "native": "日本語", - "rule": [ - "ルール" - ], - "scenario": [ - "シナリオ" - ], - "scenarioOutline": [ - "シナリオアウトライン", - "シナリオテンプレート", - "テンプレ", - "シナリオテンプレ" - ], - "then": [ - "* ", - "ならば" - ], - "when": [ - "* ", - "もし" - ] - }, - "jv": { - "and": [ - "* ", - "Lan " - ], - "background": [ - "Dasar" - ], - "but": [ - "* ", - "Tapi ", - "Nanging ", - "Ananging " - ], - "examples": [ - "Conto", - "Contone" - ], - "feature": [ - "Fitur" - ], - "given": [ - "* ", - "Nalika ", - "Nalikaning " - ], - "name": "Javanese", - "native": "Basa Jawa", - "rule": [ - "Rule" - ], - "scenario": [ - "Skenario" - ], - "scenarioOutline": [ - "Konsep skenario" - ], - "then": [ - "* ", - "Njuk ", - "Banjur " - ], - "when": [ - "* ", - "Manawa ", - "Menawa " - ] - }, - "ka": { - "and": [ - "* ", - "და ", - "ასევე " - ], - "background": [ - "კონტექსტი" - ], - "but": [ - "* ", - "მაგრამ ", - "თუმცა " - ], - "examples": [ - "მაგალითები" - ], - "feature": [ - "თვისება", - "მოთხოვნა" - ], - "given": [ - "* ", - "მოცემული ", - "Მოცემულია ", - "ვთქვათ " - ], - "name": "Georgian", - "native": "ქართული", - "rule": [ - "წესი" - ], - "scenario": [ - "მაგალითად", - "მაგალითი", - "მაგ", - "სცენარი" - ], - "scenarioOutline": [ - "სცენარის ნიმუში", - "სცენარის შაბლონი", - "ნიმუში", - "შაბლონი" - ], - "then": [ - "* ", - "მაშინ " - ], - "when": [ - "* ", - "როდესაც ", - "როცა ", - "როგორც კი ", - "თუ " - ] - }, - "kn": { - "and": [ - "* ", - "ಮತ್ತು " - ], - "background": [ - "ಹಿನ್ನೆಲೆ" - ], - "but": [ - "* ", - "ಆದರೆ " - ], - "examples": [ - "ಉದಾಹರಣೆಗಳು" - ], - "feature": [ - "ಹೆಚ್ಚಳ" - ], - "given": [ - "* ", - "ನೀಡಿದ " - ], - "name": "Kannada", - "native": "ಕನ್ನಡ", - "rule": [ - "Rule" - ], - "scenario": [ - "ಉದಾಹರಣೆ", - "ಕಥಾಸಾರಾಂಶ" - ], - "scenarioOutline": [ - "ವಿವರಣೆ" - ], - "then": [ - "* ", - "ನಂತರ " - ], - "when": [ - "* ", - "ಸ್ಥಿತಿಯನ್ನು " - ] - }, - "ko": { - "and": [ - "* ", - "그리고" - ], - "background": [ - "배경" - ], - "but": [ - "* ", - "하지만", - "단" - ], - "examples": [ - "예" - ], - "feature": [ - "기능" - ], - "given": [ - "* ", - "조건", - "먼저" - ], - "name": "Korean", - "native": "한국어", - "rule": [ - "Rule" - ], - "scenario": [ - "시나리오" - ], - "scenarioOutline": [ - "시나리오 개요" - ], - "then": [ - "* ", - "그러면" - ], - "when": [ - "* ", - "만일", - "만약" - ] - }, - "lt": { - "and": [ - "* ", - "Ir " - ], - "background": [ - "Kontekstas" - ], - "but": [ - "* ", - "Bet " - ], - "examples": [ - "Pavyzdžiai", - "Scenarijai", - "Variantai" - ], - "feature": [ - "Savybė" - ], - "given": [ - "* ", - "Duota " - ], - "name": "Lithuanian", - "native": "lietuvių kalba", - "rule": [ - "Rule" - ], - "scenario": [ - "Pavyzdys", - "Scenarijus" - ], - "scenarioOutline": [ - "Scenarijaus šablonas" - ], - "then": [ - "* ", - "Tada " - ], - "when": [ - "* ", - "Kai " - ] - }, - "lu": { - "and": [ - "* ", - "an ", - "a " - ], - "background": [ - "Hannergrond" - ], - "but": [ - "* ", - "awer ", - "mä " - ], - "examples": [ - "Beispiller" - ], - "feature": [ - "Funktionalitéit" - ], - "given": [ - "* ", - "ugeholl " - ], - "name": "Luxemburgish", - "native": "Lëtzebuergesch", - "rule": [ - "Rule" - ], - "scenario": [ - "Beispill", - "Szenario" - ], - "scenarioOutline": [ - "Plang vum Szenario" - ], - "then": [ - "* ", - "dann " - ], - "when": [ - "* ", - "wann " - ] - }, - "lv": { - "and": [ - "* ", - "Un " - ], - "background": [ - "Konteksts", - "Situācija" - ], - "but": [ - "* ", - "Bet " - ], - "examples": [ - "Piemēri", - "Paraugs" - ], - "feature": [ - "Funkcionalitāte", - "Fīča" - ], - "given": [ - "* ", - "Kad " - ], - "name": "Latvian", - "native": "latviešu", - "rule": [ - "Rule" - ], - "scenario": [ - "Piemērs", - "Scenārijs" - ], - "scenarioOutline": [ - "Scenārijs pēc parauga" - ], - "then": [ - "* ", - "Tad " - ], - "when": [ - "* ", - "Ja " - ] - }, - "mk-Cyrl": { - "and": [ - "* ", - "И " - ], - "background": [ - "Контекст", - "Содржина" - ], - "but": [ - "* ", - "Но " - ], - "examples": [ - "Примери", - "Сценарија" - ], - "feature": [ - "Функционалност", - "Бизнис потреба", - "Можност" - ], - "given": [ - "* ", - "Дадено ", - "Дадена " - ], - "name": "Macedonian", - "native": "Македонски", - "rule": [ - "Rule" - ], - "scenario": [ - "Пример", - "Сценарио", - "На пример" - ], - "scenarioOutline": [ - "Преглед на сценарија", - "Скица", - "Концепт" - ], - "then": [ - "* ", - "Тогаш " - ], - "when": [ - "* ", - "Кога " - ] - }, - "mk-Latn": { - "and": [ - "* ", - "I " - ], - "background": [ - "Kontekst", - "Sodrzhina" - ], - "but": [ - "* ", - "No " - ], - "examples": [ - "Primeri", - "Scenaria" - ], - "feature": [ - "Funkcionalnost", - "Biznis potreba", - "Mozhnost" - ], - "given": [ - "* ", - "Dadeno ", - "Dadena " - ], - "name": "Macedonian (Latin)", - "native": "Makedonski (Latinica)", - "rule": [ - "Rule" - ], - "scenario": [ - "Scenario", - "Na primer" - ], - "scenarioOutline": [ - "Pregled na scenarija", - "Skica", - "Koncept" - ], - "then": [ - "* ", - "Togash " - ], - "when": [ - "* ", - "Koga " - ] - }, - "mn": { - "and": [ - "* ", - "Мөн ", - "Тэгээд " - ], - "background": [ - "Агуулга" - ], - "but": [ - "* ", - "Гэхдээ ", - "Харин " - ], - "examples": [ - "Тухайлбал" - ], - "feature": [ - "Функц", - "Функционал" - ], - "given": [ - "* ", - "Өгөгдсөн нь ", - "Анх " - ], - "name": "Mongolian", - "native": "монгол", - "rule": [ - "Rule" - ], - "scenario": [ - "Сценар" - ], - "scenarioOutline": [ - "Сценарын төлөвлөгөө" - ], - "then": [ - "* ", - "Тэгэхэд ", - "Үүний дараа " - ], - "when": [ - "* ", - "Хэрэв " - ] - }, - "ne": { - "and": [ - "* ", - "र ", - "अनि " - ], - "background": [ - "पृष्ठभूमी" - ], - "but": [ - "* ", - "तर " - ], - "examples": [ - "उदाहरण", - "उदाहरणहरु" - ], - "feature": [ - "सुविधा", - "विशेषता" - ], - "given": [ - "* ", - "दिइएको ", - "दिएको ", - "यदि " - ], - "name": "Nepali", - "native": "नेपाली", - "rule": [ - "नियम" - ], - "scenario": [ - "परिदृश्य" - ], - "scenarioOutline": [ - "परिदृश्य रूपरेखा" - ], - "then": [ - "* ", - "त्यसपछि ", - "अनी " - ], - "when": [ - "* ", - "जब " - ] - }, - "nl": { - "and": [ - "* ", - "En " - ], - "background": [ - "Achtergrond" - ], - "but": [ - "* ", - "Maar " - ], - "examples": [ - "Voorbeelden" - ], - "feature": [ - "Functionaliteit" - ], - "given": [ - "* ", - "Gegeven ", - "Stel " - ], - "name": "Dutch", - "native": "Nederlands", - "rule": [ - "Rule" - ], - "scenario": [ - "Voorbeeld", - "Scenario" - ], - "scenarioOutline": [ - "Abstract Scenario" - ], - "then": [ - "* ", - "Dan " - ], - "when": [ - "* ", - "Als ", - "Wanneer " - ] - }, - "no": { - "and": [ - "* ", - "Og " - ], - "background": [ - "Bakgrunn" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Eksempler" - ], - "feature": [ - "Egenskap" - ], - "given": [ - "* ", - "Gitt " - ], - "name": "Norwegian", - "native": "norsk", - "rule": [ - "Regel" - ], - "scenario": [ - "Eksempel", - "Scenario" - ], - "scenarioOutline": [ - "Scenariomal", - "Abstrakt Scenario" - ], - "then": [ - "* ", - "Så " - ], - "when": [ - "* ", - "Når " - ] - }, - "pa": { - "and": [ - "* ", - "ਅਤੇ " - ], - "background": [ - "ਪਿਛੋਕੜ" - ], - "but": [ - "* ", - "ਪਰ " - ], - "examples": [ - "ਉਦਾਹਰਨਾਂ" - ], - "feature": [ - "ਖਾਸੀਅਤ", - "ਮੁਹਾਂਦਰਾ", - "ਨਕਸ਼ ਨੁਹਾਰ" - ], - "given": [ - "* ", - "ਜੇਕਰ ", - "ਜਿਵੇਂ ਕਿ " - ], - "name": "Panjabi", - "native": "ਪੰਜਾਬੀ", - "rule": [ - "Rule" - ], - "scenario": [ - "ਉਦਾਹਰਨ", - "ਪਟਕਥਾ" - ], - "scenarioOutline": [ - "ਪਟਕਥਾ ਢਾਂਚਾ", - "ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ" - ], - "then": [ - "* ", - "ਤਦ " - ], - "when": [ - "* ", - "ਜਦੋਂ " - ] - }, - "pl": { - "and": [ - "* ", - "Oraz ", - "I " - ], - "background": [ - "Założenia" - ], - "but": [ - "* ", - "Ale " - ], - "examples": [ - "Przykłady" - ], - "feature": [ - "Właściwość", - "Funkcja", - "Aspekt", - "Potrzeba biznesowa" - ], - "given": [ - "* ", - "Zakładając ", - "Mając ", - "Zakładając, że " - ], - "name": "Polish", - "native": "polski", - "rule": [ - "Zasada", - "Reguła" - ], - "scenario": [ - "Przykład", - "Scenariusz" - ], - "scenarioOutline": [ - "Szablon scenariusza" - ], - "then": [ - "* ", - "Wtedy " - ], - "when": [ - "* ", - "Jeżeli ", - "Jeśli ", - "Gdy ", - "Kiedy " - ] - }, - "pt": { - "and": [ - "* ", - "E " - ], - "background": [ - "Contexto", - "Cenário de Fundo", - "Cenario de Fundo", - "Fundo" - ], - "but": [ - "* ", - "Mas " - ], - "examples": [ - "Exemplos", - "Cenários", - "Cenarios" - ], - "feature": [ - "Funcionalidade", - "Característica", - "Caracteristica" - ], - "given": [ - "* ", - "Dado ", - "Dada ", - "Dados ", - "Dadas " - ], - "name": "Portuguese", - "native": "português", - "rule": [ - "Regra" - ], - "scenario": [ - "Exemplo", - "Cenário", - "Cenario" - ], - "scenarioOutline": [ - "Esquema do Cenário", - "Esquema do Cenario", - "Delineação do Cenário", - "Delineacao do Cenario" - ], - "then": [ - "* ", - "Então ", - "Entao " - ], - "when": [ - "* ", - "Quando " - ] - }, - "ro": { - "and": [ - "* ", - "Si ", - "Și ", - "Şi " - ], - "background": [ - "Context" - ], - "but": [ - "* ", - "Dar " - ], - "examples": [ - "Exemple" - ], - "feature": [ - "Functionalitate", - "Funcționalitate", - "Funcţionalitate" - ], - "given": [ - "* ", - "Date fiind ", - "Dat fiind ", - "Dată fiind", - "Dati fiind ", - "Dați fiind ", - "Daţi fiind " - ], - "name": "Romanian", - "native": "română", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemplu", - "Scenariu" - ], - "scenarioOutline": [ - "Structura scenariu", - "Structură scenariu" - ], - "then": [ - "* ", - "Atunci " - ], - "when": [ - "* ", - "Cand ", - "Când " - ] - }, - "ru": { - "and": [ - "* ", - "И ", - "К тому же ", - "Также " - ], - "background": [ - "Предыстория", - "Контекст" - ], - "but": [ - "* ", - "Но ", - "А ", - "Иначе " - ], - "examples": [ - "Примеры" - ], - "feature": [ - "Функция", - "Функциональность", - "Функционал", - "Свойство", - "Фича" - ], - "given": [ - "* ", - "Допустим ", - "Дано ", - "Пусть " - ], - "name": "Russian", - "native": "русский", - "rule": [ - "Правило" - ], - "scenario": [ - "Пример", - "Сценарий" - ], - "scenarioOutline": [ - "Структура сценария", - "Шаблон сценария" - ], - "then": [ - "* ", - "То ", - "Затем ", - "Тогда " - ], - "when": [ - "* ", - "Когда ", - "Если " - ] - }, - "sk": { - "and": [ - "* ", - "A ", - "A tiež ", - "A taktiež ", - "A zároveň " - ], - "background": [ - "Pozadie" - ], - "but": [ - "* ", - "Ale " - ], - "examples": [ - "Príklady" - ], - "feature": [ - "Požiadavka", - "Funkcia", - "Vlastnosť" - ], - "given": [ - "* ", - "Pokiaľ ", - "Za predpokladu " - ], - "name": "Slovak", - "native": "Slovensky", - "rule": [ - "Rule" - ], - "scenario": [ - "Príklad", - "Scenár" - ], - "scenarioOutline": [ - "Náčrt Scenáru", - "Náčrt Scenára", - "Osnova Scenára" - ], - "then": [ - "* ", - "Tak ", - "Potom " - ], - "when": [ - "* ", - "Keď ", - "Ak " - ] - }, - "sl": { - "and": [ - "In ", - "Ter " - ], - "background": [ - "Kontekst", - "Osnova", - "Ozadje" - ], - "but": [ - "Toda ", - "Ampak ", - "Vendar " - ], - "examples": [ - "Primeri", - "Scenariji" - ], - "feature": [ - "Funkcionalnost", - "Funkcija", - "Možnosti", - "Moznosti", - "Lastnost", - "Značilnost" - ], - "given": [ - "Dano ", - "Podano ", - "Zaradi ", - "Privzeto " - ], - "name": "Slovenian", - "native": "Slovenski", - "rule": [ - "Rule" - ], - "scenario": [ - "Primer", - "Scenarij" - ], - "scenarioOutline": [ - "Struktura scenarija", - "Skica", - "Koncept", - "Oris scenarija", - "Osnutek" - ], - "then": [ - "Nato ", - "Potem ", - "Takrat " - ], - "when": [ - "Ko ", - "Ce ", - "Če ", - "Kadar " - ] - }, - "sr-Cyrl": { - "and": [ - "* ", - "И " - ], - "background": [ - "Контекст", - "Основа", - "Позадина" - ], - "but": [ - "* ", - "Али " - ], - "examples": [ - "Примери", - "Сценарији" - ], - "feature": [ - "Функционалност", - "Могућност", - "Особина" - ], - "given": [ - "* ", - "За дато ", - "За дате ", - "За дати " - ], - "name": "Serbian", - "native": "Српски", - "rule": [ - "Правило" - ], - "scenario": [ - "Пример", - "Сценарио", - "Пример" - ], - "scenarioOutline": [ - "Структура сценарија", - "Скица", - "Концепт" - ], - "then": [ - "* ", - "Онда " - ], - "when": [ - "* ", - "Када ", - "Кад " - ] - }, - "sr-Latn": { - "and": [ - "* ", - "I " - ], - "background": [ - "Kontekst", - "Osnova", - "Pozadina" - ], - "but": [ - "* ", - "Ali " - ], - "examples": [ - "Primeri", - "Scenariji" - ], - "feature": [ - "Funkcionalnost", - "Mogućnost", - "Mogucnost", - "Osobina" - ], - "given": [ - "* ", - "Za dato ", - "Za date ", - "Za dati " - ], - "name": "Serbian (Latin)", - "native": "Srpski (Latinica)", - "rule": [ - "Pravilo" - ], - "scenario": [ - "Scenario", - "Primer" - ], - "scenarioOutline": [ - "Struktura scenarija", - "Skica", - "Koncept" - ], - "then": [ - "* ", - "Onda " - ], - "when": [ - "* ", - "Kada ", - "Kad " - ] - }, - "sv": { - "and": [ - "* ", - "Och " - ], - "background": [ - "Bakgrund" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Exempel" - ], - "feature": [ - "Egenskap" - ], - "given": [ - "* ", - "Givet " - ], - "name": "Swedish", - "native": "Svenska", - "rule": [ - "Regel" - ], - "scenario": [ - "Scenario" - ], - "scenarioOutline": [ - "Abstrakt Scenario", - "Scenariomall" - ], - "then": [ - "* ", - "Så " - ], - "when": [ - "* ", - "När " - ] - }, - "ta": { - "and": [ - "* ", - "மேலும் ", - "மற்றும் " - ], - "background": [ - "பின்னணி" - ], - "but": [ - "* ", - "ஆனால் " - ], - "examples": [ - "எடுத்துக்காட்டுகள்", - "காட்சிகள்", - "நிலைமைகளில்" - ], - "feature": [ - "அம்சம்", - "வணிக தேவை", - "திறன்" - ], - "given": [ - "* ", - "கொடுக்கப்பட்ட " - ], - "name": "Tamil", - "native": "தமிழ்", - "rule": [ - "Rule" - ], - "scenario": [ - "உதாரணமாக", - "காட்சி" - ], - "scenarioOutline": [ - "காட்சி சுருக்கம்", - "காட்சி வார்ப்புரு" - ], - "then": [ - "* ", - "அப்பொழுது " - ], - "when": [ - "* ", - "எப்போது " - ] - }, - "th": { - "and": [ - "* ", - "และ " - ], - "background": [ - "แนวคิด" - ], - "but": [ - "* ", - "แต่ " - ], - "examples": [ - "ชุดของตัวอย่าง", - "ชุดของเหตุการณ์" - ], - "feature": [ - "โครงหลัก", - "ความต้องการทางธุรกิจ", - "ความสามารถ" - ], - "given": [ - "* ", - "กำหนดให้ " - ], - "name": "Thai", - "native": "ไทย", - "rule": [ - "Rule" - ], - "scenario": [ - "เหตุการณ์" - ], - "scenarioOutline": [ - "สรุปเหตุการณ์", - "โครงสร้างของเหตุการณ์" - ], - "then": [ - "* ", - "ดังนั้น " - ], - "when": [ - "* ", - "เมื่อ " - ] - }, - "te": { - "and": [ - "* ", - "మరియు " - ], - "background": [ - "నేపథ్యం" - ], - "but": [ - "* ", - "కాని " - ], - "examples": [ - "ఉదాహరణలు" - ], - "feature": [ - "గుణము" - ], - "given": [ - "* ", - "చెప్పబడినది " - ], - "name": "Telugu", - "native": "తెలుగు", - "rule": [ - "Rule" - ], - "scenario": [ - "ఉదాహరణ", - "సన్నివేశం" - ], - "scenarioOutline": [ - "కథనం" - ], - "then": [ - "* ", - "అప్పుడు " - ], - "when": [ - "* ", - "ఈ పరిస్థితిలో " - ] - }, - "tlh": { - "and": [ - "* ", - "'ej ", - "latlh " - ], - "background": [ - "mo'" - ], - "but": [ - "* ", - "'ach ", - "'a " - ], - "examples": [ - "ghantoH", - "lutmey" - ], - "feature": [ - "Qap", - "Qu'meH 'ut", - "perbogh", - "poQbogh malja'", - "laH" - ], - "given": [ - "* ", - "ghu' noblu' ", - "DaH ghu' bejlu' " - ], - "name": "Klingon", - "native": "tlhIngan", - "rule": [ - "Rule" - ], - "scenario": [ - "lut" - ], - "scenarioOutline": [ - "lut chovnatlh" - ], - "then": [ - "* ", - "vaj " - ], - "when": [ - "* ", - "qaSDI' " - ] - }, - "tr": { - "and": [ - "* ", - "Ve " - ], - "background": [ - "Geçmiş" - ], - "but": [ - "* ", - "Fakat ", - "Ama " - ], - "examples": [ - "Örnekler" - ], - "feature": [ - "Özellik" - ], - "given": [ - "* ", - "Diyelim ki " - ], - "name": "Turkish", - "native": "Türkçe", - "rule": [ - "Kural" - ], - "scenario": [ - "Örnek", - "Senaryo" - ], - "scenarioOutline": [ - "Senaryo taslağı" - ], - "then": [ - "* ", - "O zaman " - ], - "when": [ - "* ", - "Eğer ki " - ] - }, - "tt": { - "and": [ - "* ", - "Һәм ", - "Вә " - ], - "background": [ - "Кереш" - ], - "but": [ - "* ", - "Ләкин ", - "Әмма " - ], - "examples": [ - "Үрнәкләр", - "Мисаллар" - ], - "feature": [ - "Мөмкинлек", - "Үзенчәлеклелек" - ], - "given": [ - "* ", - "Әйтик " - ], - "name": "Tatar", - "native": "Татарча", - "rule": [ - "Rule" - ], - "scenario": [ - "Сценарий" - ], - "scenarioOutline": [ - "Сценарийның төзелеше" - ], - "then": [ - "* ", - "Нәтиҗәдә " - ], - "when": [ - "* ", - "Әгәр " - ] - }, - "uk": { - "and": [ - "* ", - "І ", - "А також ", - "Та " - ], - "background": [ - "Передумова" - ], - "but": [ - "* ", - "Але " - ], - "examples": [ - "Приклади" - ], - "feature": [ - "Функціонал" - ], - "given": [ - "* ", - "Припустимо ", - "Припустимо, що ", - "Нехай ", - "Дано " - ], - "name": "Ukrainian", - "native": "Українська", - "rule": [ - "Rule" - ], - "scenario": [ - "Приклад", - "Сценарій" - ], - "scenarioOutline": [ - "Структура сценарію" - ], - "then": [ - "* ", - "То ", - "Тоді " - ], - "when": [ - "* ", - "Якщо ", - "Коли " - ] - }, - "ur": { - "and": [ - "* ", - "اور " - ], - "background": [ - "پس منظر" - ], - "but": [ - "* ", - "لیکن " - ], - "examples": [ - "مثالیں" - ], - "feature": [ - "صلاحیت", - "کاروبار کی ضرورت", - "خصوصیت" - ], - "given": [ - "* ", - "اگر ", - "بالفرض ", - "فرض کیا " - ], - "name": "Urdu", - "native": "اردو", - "rule": [ - "Rule" - ], - "scenario": [ - "منظرنامہ" - ], - "scenarioOutline": [ - "منظر نامے کا خاکہ" - ], - "then": [ - "* ", - "پھر ", - "تب " - ], - "when": [ - "* ", - "جب " - ] - }, - "uz": { - "and": [ - "* ", - "Ва " - ], - "background": [ - "Тарих" - ], - "but": [ - "* ", - "Лекин ", - "Бирок ", - "Аммо " - ], - "examples": [ - "Мисоллар" - ], - "feature": [ - "Функционал" - ], - "given": [ - "* ", - "Belgilangan " - ], - "name": "Uzbek", - "native": "Узбекча", - "rule": [ - "Rule" - ], - "scenario": [ - "Сценарий" - ], - "scenarioOutline": [ - "Сценарий структураси" - ], - "then": [ - "* ", - "Унда " - ], - "when": [ - "* ", - "Агар " - ] - }, - "vi": { - "and": [ - "* ", - "Và " - ], - "background": [ - "Bối cảnh" - ], - "but": [ - "* ", - "Nhưng " - ], - "examples": [ - "Dữ liệu" - ], - "feature": [ - "Tính năng" - ], - "given": [ - "* ", - "Biết ", - "Cho " - ], - "name": "Vietnamese", - "native": "Tiếng Việt", - "rule": [ - "Rule" - ], - "scenario": [ - "Tình huống", - "Kịch bản" - ], - "scenarioOutline": [ - "Khung tình huống", - "Khung kịch bản" - ], - "then": [ - "* ", - "Thì " - ], - "when": [ - "* ", - "Khi " - ] - }, - "zh-CN": { - "and": [ - "* ", - "而且", - "并且", - "同时" - ], - "background": [ - "背景" - ], - "but": [ - "* ", - "但是" - ], - "examples": [ - "例子" - ], - "feature": [ - "功能" - ], - "given": [ - "* ", - "假如", - "假设", - "假定" - ], - "name": "Chinese simplified", - "native": "简体中文", - "rule": [ - "Rule", - "规则" - ], - "scenario": [ - "场景", - "剧本" - ], - "scenarioOutline": [ - "场景大纲", - "剧本大纲" - ], - "then": [ - "* ", - "那么" - ], - "when": [ - "* ", - "当" - ] - }, - "zh-TW": { - "and": [ - "* ", - "而且", - "並且", - "同時" - ], - "background": [ - "背景" - ], - "but": [ - "* ", - "但是" - ], - "examples": [ - "例子" - ], - "feature": [ - "功能" - ], - "given": [ - "* ", - "假如", - "假設", - "假定" - ], - "name": "Chinese traditional", - "native": "繁體中文", - "rule": [ - "Rule" - ], - "scenario": [ - "場景", - "劇本" - ], - "scenarioOutline": [ - "場景大綱", - "劇本大綱" - ], - "then": [ - "* ", - "那麼" - ], - "when": [ - "* ", - "當" - ] - }, - "mr": { - "and": [ - "* ", - "आणि ", - "तसेच " - ], - "background": [ - "पार्श्वभूमी" - ], - "but": [ - "* ", - "पण ", - "परंतु " - ], - "examples": [ - "उदाहरण" - ], - "feature": [ - "वैशिष्ट्य", - "सुविधा" - ], - "given": [ - "* ", - "जर", - "दिलेल्या प्रमाणे " - ], - "name": "Marathi", - "native": "मराठी", - "rule": [ - "नियम" - ], - "scenario": [ - "परिदृश्य" - ], - "scenarioOutline": [ - "परिदृश्य रूपरेखा" - ], - "then": [ - "* ", - "मग ", - "तेव्हा " - ], - "when": [ - "* ", - "जेव्हा " - ] - }, - "amh": { - "and": [ - "* ", - "እና " - ], - "background": [ - "ቅድመ ሁኔታ", - "መነሻ", - "መነሻ ሀሳብ" - ], - "but": [ - "* ", - "ግን " - ], - "examples": [ - "ምሳሌዎች", - "ሁናቴዎች" - ], - "feature": [ - "ስራ", - "የተፈለገው ስራ", - "የሚፈለገው ድርጊት" - ], - "given": [ - "* ", - "የተሰጠ " - ], - "name": "Amharic", - "native": "አማርኛ", - "rule": [ - "ህግ" - ], - "scenario": [ - "ምሳሌ", - "ሁናቴ" - ], - "scenarioOutline": [ - "ሁናቴ ዝርዝር", - "ሁናቴ አብነት" - ], - "then": [ - "* ", - "ከዚያ " - ], - "when": [ - "* ", - "መቼ " - ] - } -} diff --git a/dart/CONTRIBUTING.md b/dart/CONTRIBUTING.md index 3540d77a7..006387f0b 100644 --- a/dart/CONTRIBUTING.md +++ b/dart/CONTRIBUTING.md @@ -1,6 +1,4 @@ Please read [CONTRIBUTING](https://github.com/cucumber/gherkin/blob/master/CONTRIBUTING.md) first. -You should clone the [cucumber/gherkin](https://github.com/cucumber/gherkin) repo if you want -to contribute. ## Run tests diff --git a/dart/LICENSE b/dart/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/dart/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/dart/Makefile b/dart/Makefile new file mode 100644 index 000000000..1c90a381b --- /dev/null +++ b/dart/Makefile @@ -0,0 +1,30 @@ +SHELL := /usr/bin/env bash + +GHERKIN_LANGUAGES_JSON = assets/gherkin-languages.json + +.DEFAULT_GOAL = help + +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +generate: + echo "Nothing to do" + +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) + +copy-gherkin-languages: $(GHERKIN_LANGUAGES_JSON) ## Copy gherkin-languages.json and/or generate derived files + +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + rm -f $(GHERKIN_LANGUAGES_JSON) + +clean: + echo "Nothing to do" + +acceptance: + echo "Nothing to do" + +.DELETE_ON_ERROR: + +$(GHERKIN_LANGUAGES_JSON): + cp ../gherkin-languages.json $@ \ No newline at end of file diff --git a/dart/README.md b/dart/README.md index 1869a86f7..a2b792b3c 100644 --- a/dart/README.md +++ b/dart/README.md @@ -1,5 +1,3 @@ # Gherkin for Dart Gherkin parser/compiler for Dart. - -See [GherkinTest](test/Gherkin_test.java) for sample usage. \ No newline at end of file diff --git a/dart/assets/gherkin-languages.json b/dart/assets/gherkin-languages.json index 351db3061..279a4d89a 100644 --- a/dart/assets/gherkin-languages.json +++ b/dart/assets/gherkin-languages.json @@ -26,7 +26,7 @@ "name": "Afrikaans", "native": "Afrikaans", "rule": [ - "Rule" + "Regel" ], "scenario": [ "Voorbeeld", @@ -303,7 +303,7 @@ "name": "Bulgarian", "native": "български", "rule": [ - "Rule" + "Правило" ], "scenario": [ "Пример", @@ -494,7 +494,7 @@ "name": "Czech", "native": "Česky", "rule": [ - "Rule" + "Pravidlo" ], "scenario": [ "Příklad", @@ -967,9 +967,12 @@ ], "when": [ "* ", - "Tha ", - "Þa ", - "Ða " + "Bæþsealf ", + "Bæþsealfa ", + "Bæþsealfe ", + "Ciricæw ", + "Ciricæwe ", + "Ciricæwa " ] }, "en-pirate": { @@ -1013,6 +1016,46 @@ "* ", "Blimey! " ] + }, + "en-tx": { + "and": [ + "Come hell or high water " + ], + "background": [ + "Lemme tell y'all a story" + ], + "but": [ + "Well now hold on, I'll you what " + ], + "examples": [ + "Now that's a story longer than a cattle drive in July" + ], + "feature": [ + "This ain’t my first rodeo", + "All gussied up" + ], + "given": [ + "Fixin' to ", + "All git out " + ], + "name": "Texas", + "native": "Texas", + "rule": [ + "Rule " + ], + "scenario": [ + "All hat and no cattle" + ], + "scenarioOutline": [ + "Serious as a snake bite", + "Busy as a hound in flea season" + ], + "then": [ + "There’s no tree but bears some fruit " + ], + "when": [ + "Quick out of the chute " + ] }, "eo": { "and": [ @@ -1078,7 +1121,9 @@ "Ejemplos" ], "feature": [ - "Característica" + "Característica", + "Necesidad del negocio", + "Requisito" ], "given": [ "* ", @@ -1090,7 +1135,8 @@ "name": "Spanish", "native": "español", "rule": [ - "Regla" + "Regla", + "Regla de negocio" ], "scenario": [ "Ejemplo", @@ -1133,14 +1179,14 @@ "name": "Estonian", "native": "eesti keel", "rule": [ - "Rule" + "Reegel" ], "scenario": [ "Juhtum", "Stsenaarium" ], "scenarioOutline": [ - "Raamstjuhtum", + "Raamjuhtum", "Raamstsenaarium" ], "then": [ @@ -1471,7 +1517,7 @@ "name": "Hebrew", "native": "עברית", "rule": [ - "Rule" + "כלל" ], "scenario": [ "דוגמא", @@ -1520,7 +1566,7 @@ "name": "Hindi", "native": "हिंदी", "rule": [ - "Rule" + "नियम" ], "scenario": [ "परिदृश्य" @@ -1672,7 +1718,7 @@ "name": "Hungarian", "native": "magyar", "rule": [ - "Rule" + "Szabály" ], "scenario": [ "Példa", @@ -1704,7 +1750,7 @@ "but": [ "* ", "Tapi ", - "Tetapi" + "Tetapi " ], "examples": [ "Contoh", @@ -1717,7 +1763,9 @@ "* ", "Dengan ", "Diketahui ", - "Diasumsikan " + "Diasumsikan ", + "Bila ", + "Jika " ], "name": "Indonesian", "native": "Bahasa Indonesia", @@ -1802,7 +1850,9 @@ "Esempi" ], "feature": [ - "Funzionalità" + "Funzionalità", + "Esigenza di Business", + "Abilità" ], "given": [ "* ", @@ -1814,7 +1864,7 @@ "name": "Italian", "native": "italiano", "rule": [ - "Rule" + "Regola" ], "scenario": [ "Esempio", @@ -1835,6 +1885,7 @@ "ja": { "and": [ "* ", + "且つ", "かつ" ], "background": [ @@ -1842,6 +1893,7 @@ ], "but": [ "* ", + "然し", "しかし", "但し", "ただし" @@ -1861,7 +1913,7 @@ "name": "Japanese", "native": "日本語", "rule": [ - "Rule" + "ルール" ], "scenario": [ "シナリオ" @@ -1932,44 +1984,57 @@ "ka": { "and": [ "* ", - "და" + "და ", + "ასევე " ], "background": [ "კონტექსტი" ], "but": [ "* ", - "მაგ­რამ" + "მაგრამ ", + "თუმცა " ], "examples": [ "მაგალითები" ], "feature": [ - "თვისება" + "თვისება", + "მოთხოვნა" ], "given": [ "* ", - "მოცემული" + "მოცემული ", + "Მოცემულია ", + "ვთქვათ " ], "name": "Georgian", - "native": "ქართველი", + "native": "ქართული", "rule": [ - "Rule" + "წესი" ], "scenario": [ "მაგალითად", - "სცენარის" + "მაგალითი", + "მაგ", + "სცენარი" ], "scenarioOutline": [ - "სცენარის ნიმუში" + "სცენარის ნიმუში", + "სცენარის შაბლონი", + "ნიმუში", + "შაბლონი" ], "then": [ "* ", - "მაშინ" + "მაშინ " ], "when": [ "* ", - "როდესაც" + "როდესაც ", + "როცა ", + "როგორც კი ", + "თუ " ] }, "kn": { @@ -2348,7 +2413,7 @@ "and": [ "* ", "र ", - "अनी " + "अनि " ], "background": [ "पृष्ठभूमी" @@ -2559,7 +2624,8 @@ "name": "Polish", "native": "polski", "rule": [ - "Rule" + "Zasada", + "Reguła" ], "scenario": [ "Przykład", @@ -2728,14 +2794,15 @@ "name": "Russian", "native": "русский", "rule": [ - "Rule" + "Правило" ], "scenario": [ "Пример", "Сценарий" ], "scenarioOutline": [ - "Структура сценария" + "Структура сценария", + "Шаблон сценария" ], "then": [ "* ", @@ -2895,7 +2962,7 @@ "name": "Serbian", "native": "Српски", "rule": [ - "Rule" + "Правило" ], "scenario": [ "Пример", @@ -2950,7 +3017,7 @@ "name": "Serbian (Latin)", "native": "Srpski (Latinica)", "rule": [ - "Rule" + "Pravilo" ], "scenario": [ "Scenario", @@ -2996,7 +3063,7 @@ "name": "Swedish", "native": "Svenska", "rule": [ - "Rule" + "Regel" ], "scenario": [ "Scenario" @@ -3109,7 +3176,7 @@ "เมื่อ " ] }, - "tl": { + "te": { "and": [ "* ", "మరియు " @@ -3228,7 +3295,7 @@ "name": "Turkish", "native": "Türkçe", "rule": [ - "Rule" + "Kural" ], "scenario": [ "Örnek", @@ -3411,7 +3478,7 @@ ], "given": [ "* ", - "Агар " + "Belgilangan " ], "name": "Uzbek", "native": "Узбекча", @@ -3621,5 +3688,54 @@ "* ", "जेव्हा " ] + }, + "amh": { + "and": [ + "* ", + "እና " + ], + "background": [ + "ቅድመ ሁኔታ", + "መነሻ", + "መነሻ ሀሳብ" + ], + "but": [ + "* ", + "ግን " + ], + "examples": [ + "ምሳሌዎች", + "ሁናቴዎች" + ], + "feature": [ + "ስራ", + "የተፈለገው ስራ", + "የሚፈለገው ድርጊት" + ], + "given": [ + "* ", + "የተሰጠ " + ], + "name": "Amharic", + "native": "አማርኛ", + "rule": [ + "ህግ" + ], + "scenario": [ + "ምሳሌ", + "ሁናቴ" + ], + "scenarioOutline": [ + "ሁናቴ ዝርዝር", + "ሁናቴ አብነት" + ], + "then": [ + "* ", + "ከዚያ " + ], + "when": [ + "* ", + "መቼ " + ] } } diff --git a/dart/gherkin.berp b/dart/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/dart/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/default.mk b/default.mk deleted file mode 100644 index a0d8dd28f..000000000 --- a/default.mk +++ /dev/null @@ -1,89 +0,0 @@ -# Please update /.templates/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -ALPINE = $(shell which apk 2> /dev/null) -LIBNAME = $(shell basename $$(pwd)) -LANGUAGES ?= $(wildcard */) - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: $(patsubst %,default-%,$(LANGUAGES)) -.PHONY: default - -default-%: % - if [[ -d $< ]]; then cd $< && make default; fi -.PHONY: default-% - -# Need to declare these phonies to avoid errors for packages without a particular language -.PHONY: c dotnet go java javascript objective-c perl python ruby - -update-dependencies: $(patsubst %,update-dependencies-%,$(LANGUAGES)) -.PHONY: update-dependencies - -update-dependencies-%: % - if [[ -d $< ]]; then cd $< && make update-dependencies; fi -.PHONY: update-dependencies-% - -update-changelog: -ifdef NEW_VERSION - cat CHANGELOG.md | ../scripts/update_changelog.sh $(NEW_VERSION) > CHANGELOG.md.tmp - mv CHANGELOG.md.tmp CHANGELOG.md -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-changelog - -pre-release: update-changelog $(patsubst %,pre-release-%,$(LANGUAGES)) -.PHONY: pre-release - -pre-release-%: % - if [[ -d $< ]]; then cd $< && make pre-release; fi -.PHONY: pre-release-% - -release: publish -.PHONY: release - -publish: create-and-push-release-tag $(patsubst %,publish-%,$(LANGUAGES)) -.PHONY: publish - -publish-%: % - if [[ -d $< ]]; then cd $< && make publish; fi -.PHONY: publish-% - -create-and-push-release-tag: - [ -f '/home/cukebot/configure' ] && /home/cukebot/configure - git commit --gpg-sign --all --message "Release $(LIBNAME) v$(NEW_VERSION)" - git tag --sign "$(LIBNAME)/v$(NEW_VERSION)" -m "Release $(LIBNAME) v$(NEW_VERSION)" - git push --tags -.PHONY: create-and-push-release-tag - -post-release: $(patsubst %,post-release-%,$(LANGUAGES)) -.PHONY: post-release - -post-release: commit-and-push-post-release - -post-release-%: % - if [[ -d $< ]]; then cd $< && make post-release; fi -.PHONY: post-release-% - -commit-and-push-post-release: -ifdef NEW_VERSION - git push --tags - git commit --gpg-sign --all --message "Post release $(LIBNAME) v$(NEW_VERSION)" 2> /dev/null || true - git push -else - @echo -e "\033[0;31mNEW_VERSION is not defined.\033[0m" - exit 1 -endif -.PHONY: commit-and-push-post-release - -clean: $(patsubst %,clean-%,$(LANGUAGES)) -.PHONY: clean - -clean-%: % - if [[ -d $< ]]; then cd $< && make clean; fi -.PHONY: clean-% diff --git a/dotnet/.github/ISSUE_TEMPLATE.md b/dotnet/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/dotnet/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/dotnet/.github/PULL_REQUEST_TEMPLATE.md b/dotnet/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/dotnet/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/dotnet/.rsync b/dotnet/.rsync deleted file mode 100644 index a019ffffe..000000000 --- a/dotnet/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../LICENSE LICENSE -../../.templates/github/ .github/ -../../.templates/dotnet/ . -../gherkin.berp gherkin.berp -../gherkin-languages.json Gherkin/gherkin-languages.json diff --git a/dotnet/.subrepo b/dotnet/.subrepo deleted file mode 100644 index 8f93556bd..000000000 --- a/dotnet/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-dotnet diff --git a/dotnet/CONTRIBUTING.md b/dotnet/CONTRIBUTING.md index 4caebbce9..8ff3aabc5 100644 --- a/dotnet/CONTRIBUTING.md +++ b/dotnet/CONTRIBUTING.md @@ -1,6 +1,4 @@ Please read [CONTRIBUTING](https://github.com/cucumber/gherkin/blob/master/CONTRIBUTING.md) first. -You should clone the [cucumber/gherkin](https://github.com/cucumber/gherkin) repo if you want -to contribute. ## Run tests @@ -8,7 +6,7 @@ to contribute. Install [.NET 5](https://github.com/dotnet/core/blob/master/release-notes/download-archives/2.0.7-download.md) -Just run `make` from this directory. +Run `make` from this directory. ### Windows diff --git a/dotnet/Gherkin/Gherkin.csproj b/dotnet/Gherkin/Gherkin.csproj index 173a2a91e..9aba3caae 100644 --- a/dotnet/Gherkin/Gherkin.csproj +++ b/dotnet/Gherkin/Gherkin.csproj @@ -22,8 +22,8 @@ Copyright © Cucumber Ltd, Gaspar Nagy Cross-platform parser for the Gherkin language, used by Cucumber, SpecFlow and other Cucumber-based tools to parse feature files. specflow gherkin cucumber - https://github.com/cucumber/common/tree/main/gherkin - https://github.com/cucumber/common + https://github.com/cucumber/gherkin + https://github.com/cucumber/gherkin git cucumber-mark-green-128.png MIT diff --git a/dotnet/LICENSE b/dotnet/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/dotnet/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/dotnet/Makefile b/dotnet/Makefile index 33eb1045a..0ad6e828d 100644 --- a/dotnet/Makefile +++ b/dotnet/Makefile @@ -1,55 +1,80 @@ -include default.mk +SHELL := /usr/bin/env bash + +GHERKIN_LANGUAGES_JSON = Gherkin/gherkin-languages.json +GHERKIN_PARSER = Gherkin/Parser.cs +GHERKIN_RAZOR = gherkin-csharp.razor +SOURCE_FILES = $(shell find . -name "*.cs" | grep -v $(GHERKIN_PARSER)) + +GHERKIN = bin/gherkin +GHERKIN_GENERATE_TOKENS = bin/gherkin-generate-tokens GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature") BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature") -TOKENS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.tokens,$(GOOD_FEATURE_FILES)) -ASTS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.ast.ndjson,$(GOOD_FEATURE_FILES)) -PICKLES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.pickles.ndjson,$(GOOD_FEATURE_FILES)) -SOURCES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.source.ndjson,$(GOOD_FEATURE_FILES)) -ERRORS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.errors.ndjson,$(BAD_FEATURE_FILES)) +TOKENS = $(patsubst ../testdata/%,acceptance/testdata/%.tokens,$(GOOD_FEATURE_FILES)) +ASTS = $(patsubst ../testdata/%,acceptance/testdata/%.ast.ndjson,$(GOOD_FEATURE_FILES)) +PICKLES = $(patsubst ../testdata/%,acceptance/testdata/%.pickles.ndjson,$(GOOD_FEATURE_FILES)) +SOURCES = $(patsubst ../testdata/%,acceptance/testdata/%.source.ndjson,$(GOOD_FEATURE_FILES)) +ERRORS = $(patsubst ../testdata/%,acceptance/testdata/%.errors.ndjson,$(BAD_FEATURE_FILES)) -.DELETE_ON_ERROR: +.DEFAULT_GOAL = help + +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +generate: $(GHERKIN_PARSER) ## Generate gherkin parser files + +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) + +copy-gherkin-languages: $(GHERKIN_LANGUAGES_JSON) ## Copy gherkin-languages.json and/or generate derived files -default: .compared +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + rm -f $(GHERKIN_LANGUAGES_JSON) -.deps: Gherkin/Parser.cs +clean: ## Remove all build artifacts and files generated by the acceptance tests + rm -f .built + rm -rf acceptance + rm -rf */bin + rm -rf */obj -Gherkin/Parser.cs: gherkin-csharp.razor gherkin.berp - $(berp-generate-parser) +.DELETE_ON_ERROR: + +acceptance: .built $(TOKENS) $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) ## Build acceptance test dir and compare results with reference -.compared: $(TOKENS) $(ASTS) $(PICKLES) $(SOURCES) $(ERRORS) +.built: $(SOURCE_FILES) Gherkin.Specs/bin/Debug/net5.0/Gherkin.Specs.dll touch $@ -acceptance/testdata/%.feature.tokens: ../testdata/%.feature ../testdata/%.feature.tokens +Gherkin.Specs/bin/Debug/net5.0/Gherkin.Specs.dll: + dotnet test + +$(GHERKIN_PARSER): $(GHERKIN_RAZOR) ../gherkin.berp + berp -g ../gherkin.berp -t $< -o $@ --noBOM + +$(GHERKIN_LANGUAGES_JSON): + cp ../gherkin-languages.json $@ + +acceptance/testdata/%.tokens: ../testdata/% ../testdata/%.tokens mkdir -p $(@D) - bin/gherkin-generate-tokens $< > $@ + $(GHERKIN_GENERATE_TOKENS) $< > $@ diff --unified $<.tokens $@ -acceptance/testdata/%.feature.ast.ndjson: ../testdata/%.feature ../testdata/%.feature.ast.ndjson +acceptance/testdata/%.ast.ndjson: ../testdata/% ../testdata/%.ast.ndjson mkdir -p $(@D) - bin/gherkin --no-source --no-pickles $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-pickles $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.ast.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.pickles.ndjson: ../testdata/%.feature ../testdata/%.feature.pickles.ndjson +acceptance/testdata/%.pickles.ndjson: ../testdata/% ../testdata/%.pickles.ndjson mkdir -p $(@D) - bin/gherkin --no-source --no-ast $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-ast $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.pickles.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.source.ndjson: ../testdata/%.feature ../testdata/%.feature.source.ndjson +acceptance/testdata/%.source.ndjson: ../testdata/% ../testdata/%.source.ndjson mkdir -p $(@D) - bin/gherkin --no-ast --no-pickles $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-ast --no-pickles $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.errors.ndjson: ../testdata/%.feature ../testdata/%.feature.errors.ndjson +acceptance/testdata/%.errors.ndjson: ../testdata/% ../testdata/%.errors.ndjson mkdir -p $(@D) - bin/gherkin --no-source $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) - -clean: - rm -rf .compared acceptance -.PHONY: clean - -clobber: clean - rm -rf Gherkin/Parser.cs -.PHONY: clobber diff --git a/dotnet/README.md b/dotnet/README.md index bec9636f4..a39a157f4 100644 --- a/dotnet/README.md +++ b/dotnet/README.md @@ -1,5 +1,5 @@ -[![Build status](https://ci.appveyor.com/api/projects/status/aa1b8h3y7pqnbhnn?svg=true)](https://ci.appveyor.com/project/aslakhellesoy/gherkin) +# Gherkin for .NET -Gherkin parser/compiler for .NET. Please see [Gherkin](https://github.com/cucumber/common/tree/main/gherkin) for details. +Gherkin parser/compiler for .NET. NuGet Repository: https://ci.appveyor.com/nuget/gherkin-pgwyovw4bucb diff --git a/dotnet/default.mk b/dotnet/default.mk deleted file mode 100644 index c72d0900a..000000000 --- a/dotnet/default.mk +++ /dev/null @@ -1,77 +0,0 @@ -# Please update /.templates/dotnet/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -ALPINE := $(shell which apk 2> /dev/null) -SLN_FILES = $(shell find . -name "*.sln") -CSPROJ_FILES = $(shell find . -name "*.csproj") -CSHARP_SOURCE_FILES = $(shell find . -name "*.cs") - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: .packed -.PHONY: default - -update-dependencies: - @echo -e "\033[0;31mPlease update dependencies for dotnet manually!!\033[0m" -.PHONY: update-dependencies - -pre-release: update-version update-dependencies clean default -.PHONY: pre-release - -update-version: -ifdef NEW_VERSION - ./scripts/update-version -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif - -.built: $(SLN_FILES) $(CSPROJ_FILES) $(CSHARP_SOURCE_FILES) .generated - dotnet build -c Release -p:SnapshotSuffix="$(SNAPSHOT_SUFFIX)" - touch $@ - -.generated: - touch $@ - -.tested: .built - dotnet test - touch $@ - -.packed: .tested - touch $@ - -# Define SNAPSHOT_SUFFIX to make pre-release: export SNAPSHOT_SUFFIX=beta-1 make publish -publish: .packed -ifdef NUGET_API_KEY - # https://circleci.com/gh/cucumber/cucumber/edit#env-vars - @dotnet nuget push --source https://api.nuget.org/v3/index.json --api-key "${NUGET_API_KEY}" $(shell find */bin/Release/NuGet -name "*.$(NEW_VERSION).nupkg") -else - @echo -e "\033[0;31mNUGET_API_KEY is not defined. Can't publish :-(\033[0m" - exit 1 -endif - -post-release: - @echo "No post-release needed for dotnet" -.PHONY: post-release - -clean: clean-dotnet -.PHONY: clean - -clean-dotnet: - rm -rf .generated .tested .built .packed GeneratedNuGetPackages - rm -rf */bin - rm -rf */obj -.PHONY: clean-dotnet - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/dotnet/gherkin.berp b/dotnet/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/dotnet/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/dotnet/scripts/update-version b/dotnet/scripts/update-version deleted file mode 100755 index 003a904f6..000000000 --- a/dotnet/scripts/update-version +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# -# Updates the version number in a .csproj file -# There must be a .releasable file next to the .csproj file -# so the script knows which one to update. -# - -releaseable_file=$(find . -type f -name "*.releaseable") -releaseable_dir=$(dirname ${releaseable_file}) -csproj_file=$(find ${releaseable_dir} -type f -name "*.csproj") - -xmlstarlet ed --inplace --ps \ - --update "/Project/PropertyGroup/VersionNumber" \ - --value "${NEW_VERSION}" \ - "${csproj_file}" diff --git a/elixir/.github/ISSUE_TEMPLATE.md b/elixir/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/elixir/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/elixir/.github/PULL_REQUEST_TEMPLATE.md b/elixir/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/elixir/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/elixir/.gitignore b/elixir/.gitignore index 3817bcd29..f1db62112 100644 --- a/elixir/.gitignore +++ b/elixir/.gitignore @@ -26,6 +26,7 @@ erl_crash.dump # End of https://www.toptal.com/developers/gitignore/api/elixir,vscode +acceptance .deps .tested .compile_messages diff --git a/elixir/.rsync b/elixir/.rsync deleted file mode 100644 index aadad2a99..000000000 --- a/elixir/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../LICENSE LICENSE -../../.templates/github/ .github/ -../../.templates/elixir/ . -../gherkin.berp resources/gherkin.berp -../gherkin-languages.json priv/gherkin_languages.json diff --git a/elixir/LICENSE b/elixir/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/elixir/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/elixir/Makefile b/elixir/Makefile index 3f7350c92..0a7700a97 100644 --- a/elixir/Makefile +++ b/elixir/Makefile @@ -1,11 +1,40 @@ -include default.mk +SHELL := /usr/bin/env bash -.deps: lib/gherkin/parser.ex +GHERKIN_LANGUAGES_JSON = priv/gherkin_languages.json +GHERKIN_PARSER = lib/gherkin/parser.ex +GHERKIN_RAZOR = gherkin-elixir.razor +SOURCE_FILES = $(shell find . -name "*.ex" | grep -v $(GHERKIN_PARSER)) -BERP_GRAMMAR = resources/gherkin.berp +.DEFAULT_GOAL = help -lib/gherkin/parser.ex: gherkin-elixir.razor $(BERP_GRAMMAR) - $(berp-generate-parser) +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) -clobber: clean - rm -f lib/gherkin/parser.ex +generate: $(GHERKIN_PARSER) ## Generate gherkin parser files + +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) + +copy-gherkin-languages: $(GHERKIN_LANGUAGES_JSON) ## Copy gherkin-languages.json and/or generate derived files + +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + rm -f $(GHERKIN_LANGUAGES_JSON) + +clean: ## Remove all build artifacts and files generated by the acceptance tests + rm -rf acceptance + rm -rf _build + rm -rf deps + +.DELETE_ON_ERROR: + +acceptance: ## Build acceptance test dir and compare results with reference + mix local.hex --force + mix deps.get + mix test + touch $@ + +$(GHERKIN_PARSER): $(GHERKIN_RAZOR) ../gherkin.berp + berp -g ../gherkin.berp -t $< -o $@ --noBOM + +$(GHERKIN_LANGUAGES_JSON): + cp ../gherkin-languages.json $@ \ No newline at end of file diff --git a/elixir/README.md b/elixir/README.md index 74eaba8de..939d496be 100644 --- a/elixir/README.md +++ b/elixir/README.md @@ -1,4 +1,4 @@ -# CucumberGherkin +# Gherkin for Exlir This Gherkin Parser is meant to parse gherkin files. In order to provide an official parser that can be maintained by the Cucumber community, the parser is generated by the Berp parser generator, which takes the gherkin grammar file. This way, when new gherkin syntax is supported, it is only a matter of generating a new parser (and making slight changes to the code base). diff --git a/elixir/default.mk b/elixir/default.mk deleted file mode 100644 index 42135dab3..000000000 --- a/elixir/default.mk +++ /dev/null @@ -1,79 +0,0 @@ -SHELL := /usr/bin/env bash -ELIXIR_SOURCE_FILES = $(shell find . -name "*.ex") - -default: .tested - -.tested: .deps $(ELIXIR_SOURCE_FILES) - mix test - touch $@ - -.deps: - mix local.hex --force - mix deps.get - touch $@ - -update-dependencies: - @echo -e "\033[0;31mPlease update dependencies for elixir manually in mix.exs!! Check https://hex.pm/ for the latest version.\033[0m" - @echo -e "\033[0;31mSome packages require some options (such as ex_doc), check the package its readme / hexdocs.\033[0m" -.PHONY: update-dependencies - -pre-release: remove-local-dependencies update-version update-dependencies clean default -.PHONY: pre-release - -remove-local-dependencies: comment_local_dependency uncomment_remote_dependency -.PHONY: remove-local-dependencies - -comment_remote_dependency: - cat mix.exs | sed 's|{:cucumber_messages, "\([^"]*\)"}|# {:cucumber_messages, "\1"}|' > mix.exs.tmp - mv mix.exs.tmp mix.exs -.PHONY: comment_remote_dependency - -uncomment_remote_dependency: - cat mix.exs | sed 's|# {:cucumber_messages, "\([^"]*\)"}|{:cucumber_messages, "\1"}|' > mix.exs.tmp - mv mix.exs.tmp mix.exs -.PHONY: uncomment_remote_dependency - -comment_local_dependency: - cat mix.exs | sed 's|{:cucumber_messages, path: "../../messages/elixir"}|# {:cucumber_messages, path: "../../messages/elixir"}|' > mix.exs.tmp - mv mix.exs.tmp mix.exs -.PHONY: comment_local_dependency - -uncomment_local_dependency: - cat mix.exs | sed 's|# {:cucumber_messages, path: "../../messages/elixir"}|{:cucumber_messages, path: "../../messages/elixir"}|' > mix.exs.tmp - mv mix.exs.tmp mix.exs -.PHONY: uncomment_local_dependency - -update-version: -ifdef NEW_VERSION - sed -Ei 's/@vsn "[^"]+"/@vsn "$(NEW_VERSION)"/' mix.exs -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-version - -publish: .deps -ifdef HEX_API_KEY - mix hex.publish --yes -else - @echo -e "\033[0;31mHEX_API_KEY is not defined. Can't update version :-(\033[0m" - exit 1 -endif - -.PHONY: publish - -post-release: comment_remote_dependency uncomment_local_dependency -.PHONY: post-release - -clean: - rm -rf _build deps .deps .tested - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/elixir/gherkin-elixir.razor b/elixir/gherkin-elixir.razor index f5e1f62dd..d99b152ab 100644 --- a/elixir/gherkin-elixir.razor +++ b/elixir/gherkin-elixir.razor @@ -2,7 +2,6 @@ # # Changes to this file may cause incorrect behavior and will be lost if # the code is regenerated. - @using Berp; @helper CallProduction(ProductionRule production) { @@ -22,7 +21,6 @@ break; } } - @helper HandleParserError(IEnumerable expectedTokens, State state){ state_comment = "State: @state.Id - @Raw(state.Comment)" @@ -31,7 +29,6 @@ @* # Just rome random comment to stop the elixir IDE linter from identifying as a string # " *@ } - @helper matchToken(TokenType tokenType) {match_@(tokenType)(context, token)} diff --git a/elixir/lib/gherkin/parser.ex b/elixir/lib/gherkin/parser.ex index 897841847..bda4a8fed 100644 --- a/elixir/lib/gherkin/parser.ex +++ b/elixir/lib/gherkin/parser.ex @@ -3,9 +3,6 @@ # Changes to this file may cause incorrect behavior and will be lost if # the code is regenerated. - - - defmodule CucumberGherkin.TokenTypes do @moduledoc false @token_types [ diff --git a/elixir/mix.exs b/elixir/mix.exs index efebfa2dd..f8b2069e1 100644 --- a/elixir/mix.exs +++ b/elixir/mix.exs @@ -29,8 +29,7 @@ defmodule CucumberGherkin.MixProject do defp deps do [ {:elixir_uuid, "~> 1.2"}, - # {:cucumber_messages, "~> 19.0"}, - {:cucumber_messages, path: "../../messages/elixir"}, + {:cucumber_messages, "~> 15.0"}, {:ex_doc, "~> 0.29", only: :dev, runtime: false} ] end diff --git a/elixir/mix.lock b/elixir/mix.lock index 31b8423d1..4abcdd9b0 100644 --- a/elixir/mix.lock +++ b/elixir/mix.lock @@ -1,6 +1,5 @@ %{ "cucumber_messages": {:hex, :cucumber_messages, "15.0.0", "0c873193e55192d6f7c6fa58f311151d746ec2c8378adba384d3807a1a4c9a44", [:make, :mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}, {:protox, "~> 1.3.0", [hex: :protox, repo: "hexpm", optional: false]}], "hexpm", "c26d123328661d8ec92333770bb017375497d16ca1d5913c07184645f5f27e24"}, - "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, "earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"}, "elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"}, "ex_doc": {:hex, :ex_doc, "0.29.0", "4a1cb903ce746aceef9c1f9ae8a6c12b742a5461e6959b9d3b24d813ffbea146", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "f096adb8bbca677d35d278223361c7792d496b3fc0d0224c9d4bc2f651af5db1"}, @@ -9,5 +8,5 @@ "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, - "protox": {:hex, :protox, "1.6.10", "41d0b0c5b9190e7d5e6a2b1a03a09257ead6f3d95e6a0cf8b81430b526126908", [:mix], [{:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "9769fca26ae7abfc5cc61308a1e8d9e2400ff89a799599cee7930d21132832d9"}, + "protox": {:hex, :protox, "1.3.2", "4d4cf313e93a46982933f9ce6fffe455ec0370e3ea50a382144cb82349c23426", [:mix], [], "hexpm", "6759cd5fed26a05c7deb51558023b588cc946c9cb2fbd5f7b5dc1832153815ca"}, } diff --git a/elixir/resources/gherkin.berp b/elixir/resources/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/elixir/resources/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/generate_dialects.js b/generate_dialects.js deleted file mode 100755 index 6d6c899fb..000000000 --- a/generate_dialects.js +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env node -// -// This script translates i18n.json (Gherkin 2) to gherkin-languages.json (Gherkin 3). -// - -var i18n = require(process.argv[2]); -var dialects = {}; - -Object.keys(i18n).forEach(function (iso) { - var lang = i18n[iso]; - - var dialect = { - name: lang.name, - native: lang.native, - feature: lang.feature.split('|'), - background: lang.background.split('|'), - scenario: lang.scenario.split('|'), - scenarioOutline: lang.scenario_outline.split('|'), - examples: lang.examples.split('|'), - given: space(lang.given.split('|')), - when: space(lang.when.split('|')), - then: space(lang.then.split('|')), - and: space(lang.and.split('|')), - but: space(lang.but.split('|')) - }; - - dialects[iso] = dialect; -}); - -function space(keywords) { - return keywords.map(function (keyword) { - if (keyword[keyword.length-1] == '<') { - return keyword.substring(0, keyword.length-1); - } else { - return keyword + ' '; - } - }); -} - -process.stdout.write(JSON.stringify(dialects, null, 2) + '\n'); diff --git a/go/.github/ISSUE_TEMPLATE.md b/go/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/go/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/go/.github/PULL_REQUEST_TEMPLATE.md b/go/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/go/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/go/.rsync b/go/.rsync deleted file mode 100644 index 1fc2c5744..000000000 --- a/go/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../LICENSE LICENSE -../../.templates/github/ .github/ -../../.templates/go/ . -../gherkin.berp gherkin.berp -../gherkin-languages.json gherkin-languages.json diff --git a/go/.subrepo b/go/.subrepo deleted file mode 100644 index ff24855f9..000000000 --- a/go/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-go diff --git a/go/.whitesource b/go/.whitesource deleted file mode 100644 index 0da93cdbd..000000000 --- a/go/.whitesource +++ /dev/null @@ -1,15 +0,0 @@ -{ - "scanSettings": { - "configMode": "AUTO", - "configExternalURL": "", - "projectToken": "", - "baseBranches": [] - }, - "checkRunSettings": { - "vulnerableCheckRunConclusionLevel": "failure", - "displayMode": "diff" - }, - "issueSettings": { - "minSeverityLevel": "LOW" - } -} diff --git a/go/LICENSE b/go/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/go/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/go/Makefile b/go/Makefile index 7409cb134..953099582 100644 --- a/go/Makefile +++ b/go/Makefile @@ -1,102 +1,83 @@ -include default.mk +SHELL := /usr/bin/env bash -GHERKIN_DIALECTS := $(shell cat gherkin-languages.json | jq --compact-output --sort-keys . | base64 | tr -d '\n') -LDFLAGS := "-X 'main.version=${NEW_VERSION}' -X 'main.gherkinDialects=${GHERKIN_DIALECTS}'" +GHERKIN_LANGUAGES_JSON = dialects_builtin.go +GHERKIN_PARSER = parser.go +GHERKIN_RAZOR = parser.go.razor +SOURCE_FILES = $(shell find . -name "*.go" | grep -v $(GHERKIN_PARSER)) + +GHERKIN = bin/gherkin +GHERKIN_GENERATE_TOKENS = bin/gherkin-generate-tokens GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature") BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature") -TOKENS_GOLDEN = $(patsubst ../testdata/%.feature,testdata/%.feature.tokens,$(GOOD_FEATURE_FILES)) -ASTS_GOLDEN = $(patsubst ../testdata/%.feature,testdata/%.feature.ast.ndjson,$(GOOD_FEATURE_FILES)) -PICKLES_GOLDEN = $(patsubst ../testdata/%.feature,testdata/%.feature.pickles.ndjson,$(GOOD_FEATURE_FILES)) -SOURCES_GOLDEN = $(patsubst ../testdata/%.feature,testdata/%.feature.source.ndjson,$(GOOD_FEATURE_FILES)) -ERRORS_GOLDEN = $(patsubst ../testdata/%.feature,testdata/%.feature.errors.ndjson,$(BAD_FEATURE_FILES)) - -TOKENS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.tokens,$(GOOD_FEATURE_FILES)) -ASTS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.ast.ndjson,$(GOOD_FEATURE_FILES)) -PICKLES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.pickles.ndjson,$(GOOD_FEATURE_FILES)) -SOURCES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.source.ndjson,$(GOOD_FEATURE_FILES)) -ERRORS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.errors.ndjson,$(BAD_FEATURE_FILES)) +TOKENS = $(patsubst ../testdata/%,acceptance/testdata/%.tokens,$(GOOD_FEATURE_FILES)) +ASTS = $(patsubst ../testdata/%,acceptance/testdata/%.ast.ndjson,$(GOOD_FEATURE_FILES)) +PICKLES = $(patsubst ../testdata/%,acceptance/testdata/%.pickles.ndjson,$(GOOD_FEATURE_FILES)) +SOURCES = $(patsubst ../testdata/%,acceptance/testdata/%.source.ndjson,$(GOOD_FEATURE_FILES)) +ERRORS = $(patsubst ../testdata/%,acceptance/testdata/%.errors.ndjson,$(BAD_FEATURE_FILES)) -.DELETE_ON_ERROR: +.DEFAULT_GOAL = help -default: .compared +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) -.compared: bin/gherkin-generate-tokens $(EXE) $(TOKENS) $(ASTS) $(PICKLES) $(SOURCES) $(ERRORS) - touch $@ +generate: $(GHERKIN_PARSER) ## Generate gherkin parser files -.tested: parser.go dialects_builtin.go +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) -# The golden target regenerates the golden master -golden: bin/gherkin-generate-tokens $(EXE) $(TOKENS_GOLDEN) $(ASTS_GOLDEN) $(PICKLES_GOLDEN) $(SOURCES_GOLDEN) $(ERRORS_GOLDEN) +copy-gherkin-languages: $(GHERKIN_LANGUAGES_JSON) ## Copy gherkin-languages.json and/or generate derived files -bin/gherkin-generate-tokens: .deps $(GO_SOURCE_FILES) parser.go dialects_builtin.go - go build -o $@ ./gherkin-generate-tokens +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + rm -f $(GHERKIN_LANGUAGES_JSON) -$(EXE): parser.go dialects_builtin.go +clean: ## Remove all build artifacts and files generated by the acceptance tests + rm -rf .built + rm -rf acceptance + rm -rf bin -testdata/%.feature.tokens: ../testdata/%.feature -ifdef GOLDEN - mkdir -p $(@D) - bin/gherkin-generate-tokens $< > $@ -endif +.DELETE_ON_ERROR: -acceptance/testdata/%.feature.tokens: ../testdata/%.feature ../testdata/%.feature.tokens bin/gherkin-generate-tokens - mkdir -p $(@D) - bin/gherkin-generate-tokens $< > $@ - diff --unified $<.tokens $@ +acceptance: .built $(TOKENS) $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) ## Build acceptance test dir and compare results with reference -testdata/%.feature.ast.ndjson: ../testdata/%.feature $(EXE) -ifdef GOLDEN - mkdir -p $(@D) - $(EXE) --predictable-ids --no-source --no-pickles $< | jq --sort-keys --compact-output > $@ -endif +.built: bin/gherkin-generate-tokens bin/gherkin + touch $@ -acceptance/testdata/%.feature.ast.ndjson: ../testdata/%.feature ../testdata/%.feature.ast.ndjson $(EXE) - mkdir -p $(@D) - $(EXE) --predictable-ids --no-source --no-pickles $< | jq --sort-keys --compact-output > $@ - diff --unified <(jq "." $<.ast.ndjson) <(jq "." $@) +bin/gherkin-generate-tokens: + go build -o $@ ./gherkin-generate-tokens -testdata/%.feature.errors.ndjson: ../testdata/%.feature $(EXE) -ifdef GOLDEN - mkdir -p $(@D) - $(EXE) --predictable-ids --no-source $< | jq --sort-keys --compact-output > $@ -endif +bin/gherkin: + go build -o $@ -a ./cmd -acceptance/testdata/%.feature.errors.ndjson: ../testdata/%.feature ../testdata/%.feature.errors.ndjson $(EXE) - mkdir -p $(@D) - $(EXE) --predictable-ids --no-source $< | jq --sort-keys --compact-output > $@ - diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) +dialects_builtin.go: ../gherkin-languages.json dialects_builtin.go.jq + cat $< | jq --sort-keys --from-file dialects_builtin.go.jq --raw-output --compact-output > $@ -testdata/%.feature.source.ndjson: ../testdata/%.feature $(EXE) -ifdef GOLDEN - mkdir -p $(@D) - $(EXE) --predictable-ids --no-ast --no-pickles $< | jq --sort-keys --compact-output > $@ -endif +$(GHERKIN_PARSER): $(GHERKIN_RAZOR) ../gherkin.berp + berp -g ../gherkin.berp -t $< -o $@ --noBOM + gofmt -w $@ -acceptance/testdata/%.feature.source.ndjson: ../testdata/%.feature ../testdata/%.feature.source.ndjson $(EXE) +acceptance/testdata/%.tokens: ../testdata/% ../testdata/%.tokens mkdir -p $(@D) - $(EXE) --predictable-ids --no-ast --no-pickles $< | jq --sort-keys --compact-output > $@ - diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) + $(GHERKIN_GENERATE_TOKENS) $< > $@ + diff --unified $<.tokens $@ -testdata/%.feature.pickles.ndjson: ../testdata/%.feature $(EXE) -ifdef GOLDEN +acceptance/testdata/%.ast.ndjson: ../testdata/% ../testdata/%.ast.ndjson mkdir -p $(@D) - $(EXE) --predictable-ids --no-source --no-ast $< | jq --sort-keys --compact-output > $@ -endif + $(GHERKIN) --no-source --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + diff --unified <(jq "." $<.ast.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.pickles.ndjson: ../testdata/%.feature ../testdata/%.feature.pickles.ndjson $(EXE) +acceptance/testdata/%.pickles.ndjson: ../testdata/% ../testdata/%.pickles.ndjson mkdir -p $(@D) - $(EXE) --predictable-ids --no-source --no-ast $< | jq --sort-keys --compact-output > $@ + $(GHERKIN) --no-source --no-ast --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.pickles.ndjson) <(jq "." $@) -parser.go: parser.go.razor gherkin.berp - $(berp-generate-parser) - gofmt -w $@ - -dialects_builtin.go: gherkin-languages.json dialects_builtin.go.jq - cat $< | jq --sort-keys --from-file dialects_builtin.go.jq --raw-output --compact-output > $@ - gofmt -w $@ +acceptance/testdata/%.source.ndjson: ../testdata/% ../testdata/%.source.ndjson + mkdir -p $(@D) + $(GHERKIN) --no-ast --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) -clean: - rm -rf .compared bin/ +acceptance/testdata/%.errors.ndjson: ../testdata/% ../testdata/%.errors.ndjson + mkdir -p $(@D) + $(GHERKIN) --no-source --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) diff --git a/go/README.md b/go/README.md index 05e2d432c..cdaba03c9 100644 --- a/go/README.md +++ b/go/README.md @@ -1,8 +1,8 @@ # Gherkin for Go -[![GoDoc](https://godoc.org/github.com/cucumber/gherkin-go?status.svg)](http://godoc.org/github.com/cucumber/gherkin-go) [![Go Report Card](https://goreportcard.com/badge/github.com/cucumber/gherkin-go)](https://goreportcard.com/report/github.com/cucumber/gherkin-go) +[![GoDoc](https://pkg.go.dev/github.com/cucumber/gherkin/go?status.svg)](http://godoc.org/github.com/cucumber/gherkin/go) -Gherkin parser/compiler for Go. Please see [Gherkin](https://github.com/cucumber/common/tree/main/gherkin) for details. +Gherkin parser/compiler for Go. Please see [Gherkin](https://github.com/cucumber/gherkin) for details. ## Building diff --git a/go/default.mk b/go/default.mk deleted file mode 100644 index f44c01cc6..000000000 --- a/go/default.mk +++ /dev/null @@ -1,162 +0,0 @@ -# Please update /.templates/go/default.mk and sync: -# source /scripts/functions.sh && rsync_files - -SHELL := /usr/bin/env bash -GOPATH := $(shell go env GOPATH) -PATH := $(PATH):$(GOPATH)/bin -GO_SOURCE_FILES := $(shell find . -name "*.go" | sort) -LIBNAME := $(shell basename $$(dirname $$(pwd))) -EXE_BASE_NAME := cucumber-$(LIBNAME) -LDFLAGS := "-X main.version=${NEW_VERSION}" - -# Enumerating Cross compilation targets -PLATFORMS = darwin-amd64 linux-386 linux-amd64 linux-arm linux-arm64 freebsd-386 freebsd-amd64 openbsd-386 openbsd-amd64 windows-386 windows-amd64 freebsd-arm netbsd-386 netbsd-amd64 netbsd-arm -PLATFORM = $(patsubst dist/$(EXE_BASE_NAME)-%,%,$@) -OS_ARCH = $(subst -, ,$(PLATFORM)) -X-OS = $(word 1, $(OS_ARCH)) -X-ARCH = $(word 2, $(OS_ARCH)) - -OS := $(shell go env GOOS) -ARCH := $(shell go env GOARCH) -EXE := dist/$(EXE_BASE_NAME)-$(OS)-$(ARCH) - -ifndef NO_CROSS_COMPILE -EXES = $(patsubst %,dist/$(EXE_BASE_NAME)-%,$(PLATFORMS)) -else -EXES = $(EXE) -endif - -GO_REPLACEMENTS := $(shell sed -n "/^\s*github.com\/cucumber\/common/p" go.mod | perl -wpe 's/\s*(github.com\/cucumber\/common\/(.*)\/go\/v\d+).*/q{replace } . $$1 . q{ => ..\/..\/} . $$2 . q{\/go}/eg') -CURRENT_MAJOR := $(shell sed -n "/^module/p" go.mod | awk '{ print $$0 "/v1" }' | cut -d'/' -f6 | cut -d'v' -f2) -NEW_MAJOR := $(shell echo ${NEW_VERSION} | awk -F'.' '{print $$1}') - -GO_MAJOR_V = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f1) -GO_MINOR_V = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f2) -MIN_SUPPORTED_GO_MAJOR_V = 1 -MIN_SUPPORTED_GO_MINOR_V = 13 - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: .linted .tested -.PHONY: default - -# Run the .dist target if there is a main file -ifneq (,$(wildcard ./cmd/main.go)) -default: dist -endif - -.deps: - touch $@ - -dist: $(EXES) - -dist/$(EXE_BASE_NAME)-%: .deps $(GO_SOURCE_FILES) go.mod - mkdir -p dist - echo "EXES=$(EXES)" - echo "Building $@" - - # Determine if we're on a supported go platform - @if [ $(GO_MAJOR_V) -gt $(MIN_SUPPORTED_GO_MAJOR_V) ]; then \ - exit 0 ;\ - elif [ $(GO_MAJOR_V) -lt $(MIN_SUPPORTED_GO_MAJOR_V) ]; then \ - echo '$(GO_MAJOR_V).$(GO_MINOR_V) is not a supported version, $(MIN_SUPPORTED_GO_MAJOR_V).$(MIN_SUPPORTED_GO_MINOR_V) is required';\ - exit 1; \ - elif [ $(GO_MINOR_V) -lt $(MIN_SUPPORTED_GO_MINOR_V) ] ; then \ - echo '$(GO_MAJOR_V).$(GO_MINOR_V) is not a supported version, $(MIN_SUPPORTED_GO_MAJOR_V).$(MIN_SUPPORTED_GO_MINOR_V) is required';\ - exit 1; \ - fi - - GOOS=$(X-OS) GOARCH=$(X-ARCH) go build -buildmode=exe -ldflags $(LDFLAGS) -o $@ -a ./cmd -ifndef NO_UPX_COMPRESSION - # requires upx in PATH to compress supported binaries - # may produce an error ARCH not supported - -upx $@ -o $@.upx - - # If the compressed file passes the integrity test, replace the original - # file with the compressed file. Otherwise, preserve the original file - # and remove the compressed file. - if [ -f "$@.upx" ]; then upx -t $@.upx && mv $@.upx $@ || rm -f $@.upx; fi -endif - -update-dependencies: - go get -u && go mod tidy -.PHONY: update-dependencies - -pre-release: remove-replaces update-version update-dependencies clean default -.PHONY: pre-release - -update-version: update-major - # no-op -.PHONY: update-version - -ifneq (,$(wildcard ./cmd/main.go)) -publish: dist -ifdef NEW_VERSION - ./scripts/github-release $(NEW_VERSION) -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't publish :-(\033[0m" - exit 1 -endif -else -publish: -ifdef NEW_VERSION - git tag --sign "$(LIBNAME)/go/v$(NEW_VERSION)" -m "Release $(LIBNAME)/go v$(NEW_VERSION)" - git push --tags -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't publish :-(\033[0m" - exit 1 -endif -endif -.PHONY: publish - -.linted: $(GO_SOURCE_FILES) - gofmt -w $^ - touch $@ - -.tested: .deps $(GO_SOURCE_FILES) - go test ./... - touch $@ - -post-release: -ifdef NEW_VERSION - pushd ../.. && \ - source scripts/functions.sh && update_go_library_version $(LIBNAME) $(NEW_VERSION) && \ - popd -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't post-release :-(\033[0m" - exit 1 -endif -.PHONY: post-release - -clean: clean-go -.PHONY: clean - -clean-go: - rm -rf .deps .tested* .linted dist/ acceptance/ -.PHONY: clean-go - -remove-replaces: - sed -i '/^replace/d' go.mod - sed -i 'N;/^\n$$/D;P;D;' go.mod -.PHONY: remove-replaces - -update-major: -ifeq ($(CURRENT_MAJOR), $(NEW_MAJOR)) - # echo "No major version change" -else - echo "Updating major from $(CURRENT_MAJOR) to $(NEW_MAJOR)" - sed -Ei "s/$(LIBNAME)\/go(\/v$(CURRENT_MAJOR))?/$(LIBNAME)\/go\/v$(NEW_MAJOR)/" go.mod - sed -Ei "s/$(LIBNAME)\/go(\/v$(CURRENT_MAJOR))?/$(LIBNAME)\/go\/v$(NEW_MAJOR)/" $(shell find . -name "*.go") -endif -.PHONY: update-major - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/go/dialects_builtin.go b/go/dialects_builtin.go index 4e101ea66..8930ba261 100644 --- a/go/dialects_builtin.go +++ b/go/dialects_builtin.go @@ -127,6 +127,7 @@ var builtinDialects = gherkinDialectMap{ "Դիցուք ": messages.StepKeywordType_CONTEXT, "Եթե ": messages.StepKeywordType_ACTION, + "Երբ ": messages.StepKeywordType_ACTION, "Ապա ": messages.StepKeywordType_OUTCOME, @@ -186,18 +187,24 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Dau ": messages.StepKeywordType_CONTEXT, - "Dada ": messages.StepKeywordType_CONTEXT, - "Daus ": messages.StepKeywordType_CONTEXT, + "Dau ": messages.StepKeywordType_CONTEXT, + + "Dada ": messages.StepKeywordType_CONTEXT, + + "Daus ": messages.StepKeywordType_CONTEXT, + "Dadas ": messages.StepKeywordType_CONTEXT, "Cuan ": messages.StepKeywordType_ACTION, - "Alavez ": messages.StepKeywordType_OUTCOME, - "Allora ": messages.StepKeywordType_OUTCOME, + "Alavez ": messages.StepKeywordType_OUTCOME, + + "Allora ": messages.StepKeywordType_OUTCOME, + "Antonces ": messages.StepKeywordType_OUTCOME, "Y ": messages.StepKeywordType_CONJUNCTION, + "E ": messages.StepKeywordType_CONJUNCTION, "Pero ": messages.StepKeywordType_CONJUNCTION, @@ -251,11 +258,13 @@ var builtinDialects = gherkinDialectMap{ map[string]messages.StepKeywordType{ "بفرض ": messages.StepKeywordType_CONTEXT, - "متى ": messages.StepKeywordType_ACTION, + "متى ": messages.StepKeywordType_ACTION, + "عندما ": messages.StepKeywordType_ACTION, "اذاً ": messages.StepKeywordType_OUTCOME, - "ثم ": messages.StepKeywordType_OUTCOME, + + "ثم ": messages.StepKeywordType_OUTCOME, "و ": messages.StepKeywordType_CONJUNCTION, @@ -310,16 +319,20 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Dáu ": messages.StepKeywordType_CONTEXT, + "Dáu ": messages.StepKeywordType_CONTEXT, + "Dada ": messages.StepKeywordType_CONTEXT, + "Daos ": messages.StepKeywordType_CONTEXT, + "Daes ": messages.StepKeywordType_CONTEXT, "Cuando ": messages.StepKeywordType_ACTION, "Entós ": messages.StepKeywordType_OUTCOME, - "Y ": messages.StepKeywordType_CONJUNCTION, + "Y ": messages.StepKeywordType_CONJUNCTION, + "Ya ": messages.StepKeywordType_CONJUNCTION, "Peru ": messages.StepKeywordType_CONJUNCTION, @@ -375,17 +388,21 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Tutaq ki ": messages.StepKeywordType_CONTEXT, - "Verilir ": messages.StepKeywordType_CONTEXT, - "Əgər ": messages.StepKeywordType_ACTION, + "Verilir ": messages.StepKeywordType_CONTEXT, + + "Əgər ": messages.StepKeywordType_ACTION, + "Nə vaxt ki ": messages.StepKeywordType_ACTION, "O halda ": messages.StepKeywordType_OUTCOME, - "Və ": messages.StepKeywordType_CONJUNCTION, + "Və ": messages.StepKeywordType_CONJUNCTION, + "Həm ": messages.StepKeywordType_CONJUNCTION, - "Amma ": messages.StepKeywordType_CONJUNCTION, + "Amma ": messages.StepKeywordType_CONJUNCTION, + "Ancaq ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, @@ -496,17 +513,20 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Diberi ": messages.StepKeywordType_CONTEXT, - "Bagi ": messages.StepKeywordType_CONTEXT, + + "Bagi ": messages.StepKeywordType_CONTEXT, "Apabila ": messages.StepKeywordType_ACTION, - "Maka ": messages.StepKeywordType_OUTCOME, + "Maka ": messages.StepKeywordType_OUTCOME, + "Kemudian ": messages.StepKeywordType_OUTCOME, "Dan ": messages.StepKeywordType_CONJUNCTION, "Tetapi ": messages.StepKeywordType_CONJUNCTION, - "Tapi ": messages.StepKeywordType_CONJUNCTION, + + "Tapi ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -563,6 +583,7 @@ var builtinDialects = gherkinDialectMap{ "Zatim ": messages.StepKeywordType_OUTCOME, "I ": messages.StepKeywordType_CONJUNCTION, + "A ": messages.StepKeywordType_CONJUNCTION, "Ali ": messages.StepKeywordType_CONJUNCTION, @@ -618,15 +639,19 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Donat ": messages.StepKeywordType_CONTEXT, + "Donat ": messages.StepKeywordType_CONTEXT, + "Donada ": messages.StepKeywordType_CONTEXT, - "Atès ": messages.StepKeywordType_CONTEXT, - "Atesa ": messages.StepKeywordType_CONTEXT, + + "Atès ": messages.StepKeywordType_CONTEXT, + + "Atesa ": messages.StepKeywordType_CONTEXT, "Quan ": messages.StepKeywordType_ACTION, "Aleshores ": messages.StepKeywordType_OUTCOME, - "Cal ": messages.StepKeywordType_OUTCOME, + + "Cal ": messages.StepKeywordType_OUTCOME, "I ": messages.StepKeywordType_CONJUNCTION, @@ -681,7 +706,8 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Pokud ": messages.StepKeywordType_CONTEXT, + "Pokud ": messages.StepKeywordType_CONTEXT, + "Za předpokladu ": messages.StepKeywordType_CONTEXT, "Když ": messages.StepKeywordType_ACTION, @@ -689,7 +715,8 @@ var builtinDialects = gherkinDialectMap{ "Pak ": messages.StepKeywordType_OUTCOME, "A také ": messages.StepKeywordType_CONJUNCTION, - "A ": messages.StepKeywordType_CONJUNCTION, + + "A ": messages.StepKeywordType_CONJUNCTION, "Ale ": messages.StepKeywordType_CONJUNCTION, @@ -856,8 +883,10 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Angenommen ": messages.StepKeywordType_CONTEXT, - "Gegeben sei ": messages.StepKeywordType_CONTEXT, + "Angenommen ": messages.StepKeywordType_CONTEXT, + + "Gegeben sei ": messages.StepKeywordType_CONTEXT, + "Gegeben seien ": messages.StepKeywordType_CONTEXT, "Wenn ": messages.StepKeywordType_ACTION, @@ -1087,13 +1116,16 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Givun ": messages.StepKeywordType_CONTEXT, + "Givun ": messages.StepKeywordType_CONTEXT, + "Youse know when youse got ": messages.StepKeywordType_CONTEXT, - "Wun ": messages.StepKeywordType_ACTION, + "Wun ": messages.StepKeywordType_ACTION, + "Youse know like when ": messages.StepKeywordType_ACTION, - "Dun ": messages.StepKeywordType_OUTCOME, + "Dun ": messages.StepKeywordType_OUTCOME, + "Den youse gotta ": messages.StepKeywordType_OUTCOME, "An ": messages.StepKeywordType_CONJUNCTION, @@ -1271,25 +1303,38 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Thurh ": messages.StepKeywordType_CONTEXT, - "Þurh ": messages.StepKeywordType_CONTEXT, - "Ðurh ": messages.StepKeywordType_CONTEXT, - "Bæþsealf ": messages.StepKeywordType_ACTION, + "Þurh ": messages.StepKeywordType_CONTEXT, + + "Ðurh ": messages.StepKeywordType_CONTEXT, + + "Bæþsealf ": messages.StepKeywordType_ACTION, + "Bæþsealfa ": messages.StepKeywordType_ACTION, + "Bæþsealfe ": messages.StepKeywordType_ACTION, - "Ciricæw ": messages.StepKeywordType_ACTION, - "Ciricæwe ": messages.StepKeywordType_ACTION, - "Ciricæwa ": messages.StepKeywordType_ACTION, - "Tha ": messages.StepKeywordType_OUTCOME, - "Þa ": messages.StepKeywordType_OUTCOME, - "Ða ": messages.StepKeywordType_OUTCOME, + "Ciricæw ": messages.StepKeywordType_ACTION, + + "Ciricæwe ": messages.StepKeywordType_ACTION, + + "Ciricæwa ": messages.StepKeywordType_ACTION, + + "Tha ": messages.StepKeywordType_OUTCOME, + + "Þa ": messages.StepKeywordType_OUTCOME, + + "Ða ": messages.StepKeywordType_OUTCOME, + "Tha the ": messages.StepKeywordType_OUTCOME, - "Þa þe ": messages.StepKeywordType_OUTCOME, - "Ða ðe ": messages.StepKeywordType_OUTCOME, + + "Þa þe ": messages.StepKeywordType_OUTCOME, + + "Ða ðe ": messages.StepKeywordType_OUTCOME, "Ond ": messages.StepKeywordType_CONJUNCTION, - "7 ": messages.StepKeywordType_CONJUNCTION, + + "7 ": messages.StepKeywordType_CONJUNCTION, "Ac ": messages.StepKeywordType_CONJUNCTION, @@ -1389,7 +1434,8 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Fixin' to ": messages.StepKeywordType_CONTEXT, + "Fixin' to ": messages.StepKeywordType_CONTEXT, + "All git out ": messages.StepKeywordType_CONTEXT, "Quick out of the chute ": messages.StepKeywordType_ACTION, @@ -1450,7 +1496,8 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Donitaĵo ": messages.StepKeywordType_CONTEXT, - "Komence ": messages.StepKeywordType_CONTEXT, + + "Komence ": messages.StepKeywordType_CONTEXT, "Se ": messages.StepKeywordType_ACTION, @@ -1512,9 +1559,12 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Dado ": messages.StepKeywordType_CONTEXT, - "Dada ": messages.StepKeywordType_CONTEXT, + "Dado ": messages.StepKeywordType_CONTEXT, + + "Dada ": messages.StepKeywordType_CONTEXT, + "Dados ": messages.StepKeywordType_CONTEXT, + "Dadas ": messages.StepKeywordType_CONTEXT, "Cuando ": messages.StepKeywordType_ACTION, @@ -1522,6 +1572,7 @@ var builtinDialects = gherkinDialectMap{ "Entonces ": messages.StepKeywordType_OUTCOME, "Y ": messages.StepKeywordType_CONJUNCTION, + "E ": messages.StepKeywordType_CONJUNCTION, "Pero ": messages.StepKeywordType_CONJUNCTION, @@ -1759,37 +1810,59 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Soit ": messages.StepKeywordType_CONTEXT, - "Sachant que ": messages.StepKeywordType_CONTEXT, - "Sachant qu'": messages.StepKeywordType_CONTEXT, - "Sachant ": messages.StepKeywordType_CONTEXT, + "Soit ": messages.StepKeywordType_CONTEXT, + + "Sachant que ": messages.StepKeywordType_CONTEXT, + + "Sachant qu'": messages.StepKeywordType_CONTEXT, + + "Sachant ": messages.StepKeywordType_CONTEXT, + "Etant donné que ": messages.StepKeywordType_CONTEXT, - "Etant donné qu'": messages.StepKeywordType_CONTEXT, - "Etant donné ": messages.StepKeywordType_CONTEXT, - "Etant donnée ": messages.StepKeywordType_CONTEXT, - "Etant donnés ": messages.StepKeywordType_CONTEXT, - "Etant données ": messages.StepKeywordType_CONTEXT, + + "Etant donné qu'": messages.StepKeywordType_CONTEXT, + + "Etant donné ": messages.StepKeywordType_CONTEXT, + + "Etant donnée ": messages.StepKeywordType_CONTEXT, + + "Etant donnés ": messages.StepKeywordType_CONTEXT, + + "Etant données ": messages.StepKeywordType_CONTEXT, + "Étant donné que ": messages.StepKeywordType_CONTEXT, - "Étant donné qu'": messages.StepKeywordType_CONTEXT, - "Étant donné ": messages.StepKeywordType_CONTEXT, - "Étant donnée ": messages.StepKeywordType_CONTEXT, - "Étant donnés ": messages.StepKeywordType_CONTEXT, - "Étant données ": messages.StepKeywordType_CONTEXT, - "Quand ": messages.StepKeywordType_ACTION, + "Étant donné qu'": messages.StepKeywordType_CONTEXT, + + "Étant donné ": messages.StepKeywordType_CONTEXT, + + "Étant donnée ": messages.StepKeywordType_CONTEXT, + + "Étant donnés ": messages.StepKeywordType_CONTEXT, + + "Étant données ": messages.StepKeywordType_CONTEXT, + + "Quand ": messages.StepKeywordType_ACTION, + "Lorsque ": messages.StepKeywordType_ACTION, - "Lorsqu'": messages.StepKeywordType_ACTION, + + "Lorsqu'": messages.StepKeywordType_ACTION, "Alors ": messages.StepKeywordType_OUTCOME, - "Donc ": messages.StepKeywordType_OUTCOME, + + "Donc ": messages.StepKeywordType_OUTCOME, "Et que ": messages.StepKeywordType_CONJUNCTION, - "Et qu'": messages.StepKeywordType_CONJUNCTION, - "Et ": messages.StepKeywordType_CONJUNCTION, + + "Et qu'": messages.StepKeywordType_CONJUNCTION, + + "Et ": messages.StepKeywordType_CONJUNCTION, "Mais que ": messages.StepKeywordType_CONJUNCTION, - "Mais qu'": messages.StepKeywordType_CONJUNCTION, - "Mais ": messages.StepKeywordType_CONJUNCTION, + + "Mais qu'": messages.StepKeywordType_CONJUNCTION, + + "Mais ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -1842,15 +1915,21 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Cuir i gcás go": messages.StepKeywordType_CONTEXT, + "Cuir i gcás go": messages.StepKeywordType_CONTEXT, + "Cuir i gcás nach": messages.StepKeywordType_CONTEXT, - "Cuir i gcás gur": messages.StepKeywordType_CONTEXT, - "Cuir i gcás nár": messages.StepKeywordType_CONTEXT, - "Nuair a": messages.StepKeywordType_ACTION, + "Cuir i gcás gur": messages.StepKeywordType_CONTEXT, + + "Cuir i gcás nár": messages.StepKeywordType_CONTEXT, + + "Nuair a": messages.StepKeywordType_ACTION, + "Nuair nach": messages.StepKeywordType_ACTION, - "Nuair ba": messages.StepKeywordType_ACTION, - "Nuair nár": messages.StepKeywordType_ACTION, + + "Nuair ba": messages.StepKeywordType_ACTION, + + "Nuair nár": messages.StepKeywordType_ACTION, "Ansin": messages.StepKeywordType_OUTCOME, @@ -1966,19 +2045,24 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Dado ": messages.StepKeywordType_CONTEXT, - "Dada ": messages.StepKeywordType_CONTEXT, + "Dado ": messages.StepKeywordType_CONTEXT, + + "Dada ": messages.StepKeywordType_CONTEXT, + "Dados ": messages.StepKeywordType_CONTEXT, + "Dadas ": messages.StepKeywordType_CONTEXT, "Cando ": messages.StepKeywordType_ACTION, "Entón ": messages.StepKeywordType_OUTCOME, - "Logo ": messages.StepKeywordType_OUTCOME, + + "Logo ": messages.StepKeywordType_OUTCOME, "E ": messages.StepKeywordType_CONJUNCTION, "Mais ": messages.StepKeywordType_CONJUNCTION, + "Pero ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, @@ -2031,7 +2115,8 @@ var builtinDialects = gherkinDialectMap{ "כאשר ": messages.StepKeywordType_ACTION, - "אז ": messages.StepKeywordType_OUTCOME, + "אז ": messages.StepKeywordType_OUTCOME, + "אזי ": messages.StepKeywordType_OUTCOME, "וגם ": messages.StepKeywordType_CONJUNCTION, @@ -2089,21 +2174,28 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "अगर ": messages.StepKeywordType_CONTEXT, - "यदि ": messages.StepKeywordType_CONTEXT, + "अगर ": messages.StepKeywordType_CONTEXT, + + "यदि ": messages.StepKeywordType_CONTEXT, + "चूंकि ": messages.StepKeywordType_CONTEXT, - "जब ": messages.StepKeywordType_ACTION, + "जब ": messages.StepKeywordType_ACTION, + "कदा ": messages.StepKeywordType_ACTION, - "तब ": messages.StepKeywordType_OUTCOME, + "तब ": messages.StepKeywordType_OUTCOME, + "तदा ": messages.StepKeywordType_OUTCOME, - "और ": messages.StepKeywordType_CONJUNCTION, + "और ": messages.StepKeywordType_CONJUNCTION, + "तथा ": messages.StepKeywordType_CONJUNCTION, - "पर ": messages.StepKeywordType_CONJUNCTION, + "पर ": messages.StepKeywordType_CONJUNCTION, + "परन्तु ": messages.StepKeywordType_CONJUNCTION, + "किन्तु ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, @@ -2159,13 +2251,17 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Zadan ": messages.StepKeywordType_CONTEXT, - "Zadani ": messages.StepKeywordType_CONTEXT, - "Zadano ": messages.StepKeywordType_CONTEXT, + "Zadan ": messages.StepKeywordType_CONTEXT, + + "Zadani ": messages.StepKeywordType_CONTEXT, + + "Zadano ": messages.StepKeywordType_CONTEXT, + "Ukoliko ": messages.StepKeywordType_CONTEXT, "Kada ": messages.StepKeywordType_ACTION, - "Kad ": messages.StepKeywordType_ACTION, + + "Kad ": messages.StepKeywordType_ACTION, "Onda ": messages.StepKeywordType_OUTCOME, @@ -2231,19 +2327,25 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Sipoze ": messages.StepKeywordType_CONTEXT, + "Sipoze ": messages.StepKeywordType_CONTEXT, + "Sipoze ke ": messages.StepKeywordType_CONTEXT, + "Sipoze Ke ": messages.StepKeywordType_CONTEXT, "Lè ": messages.StepKeywordType_ACTION, + "Le ": messages.StepKeywordType_ACTION, "Lè sa a ": messages.StepKeywordType_OUTCOME, + "Le sa a ": messages.StepKeywordType_OUTCOME, - "Ak ": messages.StepKeywordType_CONJUNCTION, + "Ak ": messages.StepKeywordType_CONJUNCTION, + "Epi ": messages.StepKeywordType_CONJUNCTION, - "E ": messages.StepKeywordType_CONJUNCTION, + + "E ": messages.StepKeywordType_CONJUNCTION, "Men ": messages.StepKeywordType_CONJUNCTION, @@ -2296,10 +2398,13 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Amennyiben ": messages.StepKeywordType_CONTEXT, - "Adott ": messages.StepKeywordType_CONTEXT, - "Majd ": messages.StepKeywordType_ACTION, - "Ha ": messages.StepKeywordType_ACTION, + "Adott ": messages.StepKeywordType_CONTEXT, + + "Majd ": messages.StepKeywordType_ACTION, + + "Ha ": messages.StepKeywordType_ACTION, + "Amikor ": messages.StepKeywordType_ACTION, "Akkor ": messages.StepKeywordType_OUTCOME, @@ -2362,20 +2467,26 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Dengan ": messages.StepKeywordType_CONTEXT, - "Diketahui ": messages.StepKeywordType_CONTEXT, + "Dengan ": messages.StepKeywordType_CONTEXT, + + "Diketahui ": messages.StepKeywordType_CONTEXT, + "Diasumsikan ": messages.StepKeywordType_CONTEXT, - "Bila ": messages.StepKeywordType_CONTEXT, - "Jika ": messages.StepKeywordType_CONTEXT, + + "Bila ": messages.StepKeywordType_CONTEXT, + + "Jika ": messages.StepKeywordType_CONTEXT, "Ketika ": messages.StepKeywordType_ACTION, - "Maka ": messages.StepKeywordType_OUTCOME, + "Maka ": messages.StepKeywordType_OUTCOME, + "Kemudian ": messages.StepKeywordType_OUTCOME, "Dan ": messages.StepKeywordType_CONJUNCTION, - "Tapi ": messages.StepKeywordType_CONJUNCTION, + "Tapi ": messages.StepKeywordType_CONJUNCTION, + "Tetapi ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, @@ -2485,8 +2596,11 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Dato ": messages.StepKeywordType_CONTEXT, + "Data ": messages.StepKeywordType_CONTEXT, + "Dati ": messages.StepKeywordType_CONTEXT, + "Date ": messages.StepKeywordType_CONTEXT, "Quando ": messages.StepKeywordType_ACTION, @@ -2557,11 +2671,15 @@ var builtinDialects = gherkinDialectMap{ "ならば": messages.StepKeywordType_OUTCOME, "且つ": messages.StepKeywordType_CONJUNCTION, + "かつ": messages.StepKeywordType_CONJUNCTION, - "然し": messages.StepKeywordType_CONJUNCTION, + "然し": messages.StepKeywordType_CONJUNCTION, + "しかし": messages.StepKeywordType_CONJUNCTION, - "但し": messages.StepKeywordType_CONJUNCTION, + + "但し": messages.StepKeywordType_CONJUNCTION, + "ただし": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, @@ -2614,19 +2732,24 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Nalika ": messages.StepKeywordType_CONTEXT, + "Nalika ": messages.StepKeywordType_CONTEXT, + "Nalikaning ": messages.StepKeywordType_CONTEXT, "Manawa ": messages.StepKeywordType_ACTION, + "Menawa ": messages.StepKeywordType_ACTION, - "Njuk ": messages.StepKeywordType_OUTCOME, + "Njuk ": messages.StepKeywordType_OUTCOME, + "Banjur ": messages.StepKeywordType_OUTCOME, "Lan ": messages.StepKeywordType_CONJUNCTION, - "Tapi ": messages.StepKeywordType_CONJUNCTION, - "Nanging ": messages.StepKeywordType_CONJUNCTION, + "Tapi ": messages.StepKeywordType_CONJUNCTION, + + "Nanging ": messages.StepKeywordType_CONJUNCTION, + "Ananging ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, @@ -2687,22 +2810,29 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "მოცემული ": messages.StepKeywordType_CONTEXT, + "მოცემული ": messages.StepKeywordType_CONTEXT, + "Მოცემულია ": messages.StepKeywordType_CONTEXT, - "ვთქვათ ": messages.StepKeywordType_CONTEXT, - "როდესაც ": messages.StepKeywordType_ACTION, - "როცა ": messages.StepKeywordType_ACTION, + "ვთქვათ ": messages.StepKeywordType_CONTEXT, + + "როდესაც ": messages.StepKeywordType_ACTION, + + "როცა ": messages.StepKeywordType_ACTION, + "როგორც კი ": messages.StepKeywordType_ACTION, - "თუ ": messages.StepKeywordType_ACTION, + + "თუ ": messages.StepKeywordType_ACTION, "მაშინ ": messages.StepKeywordType_OUTCOME, - "და ": messages.StepKeywordType_CONJUNCTION, + "და ": messages.StepKeywordType_CONJUNCTION, + "ასევე ": messages.StepKeywordType_CONJUNCTION, "მაგრამ ": messages.StepKeywordType_CONJUNCTION, - "თუმცა ": messages.StepKeywordType_CONJUNCTION, + + "თუმცა ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -2807,9 +2937,11 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "조건": messages.StepKeywordType_CONTEXT, + "먼저": messages.StepKeywordType_CONTEXT, "만일": messages.StepKeywordType_ACTION, + "만약": messages.StepKeywordType_ACTION, "그러면": messages.StepKeywordType_OUTCOME, @@ -2817,7 +2949,8 @@ var builtinDialects = gherkinDialectMap{ "그리고": messages.StepKeywordType_CONJUNCTION, "하지만": messages.StepKeywordType_CONJUNCTION, - "단": messages.StepKeywordType_CONJUNCTION, + + "단": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -2930,10 +3063,12 @@ var builtinDialects = gherkinDialectMap{ "dann ": messages.StepKeywordType_OUTCOME, "an ": messages.StepKeywordType_CONJUNCTION, - "a ": messages.StepKeywordType_CONJUNCTION, + + "a ": messages.StepKeywordType_CONJUNCTION, "awer ": messages.StepKeywordType_CONJUNCTION, - "mä ": messages.StepKeywordType_CONJUNCTION, + + "mä ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -3047,6 +3182,7 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Дадено ": messages.StepKeywordType_CONTEXT, + "Дадена ": messages.StepKeywordType_CONTEXT, "Кога ": messages.StepKeywordType_ACTION, @@ -3110,6 +3246,7 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Dadeno ": messages.StepKeywordType_CONTEXT, + "Dadena ": messages.StepKeywordType_CONTEXT, "Koga ": messages.StepKeywordType_ACTION, @@ -3170,18 +3307,22 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Өгөгдсөн нь ": messages.StepKeywordType_CONTEXT, - "Анх ": messages.StepKeywordType_CONTEXT, + + "Анх ": messages.StepKeywordType_CONTEXT, "Хэрэв ": messages.StepKeywordType_ACTION, - "Тэгэхэд ": messages.StepKeywordType_OUTCOME, + "Тэгэхэд ": messages.StepKeywordType_OUTCOME, + "Үүний дараа ": messages.StepKeywordType_OUTCOME, - "Мөн ": messages.StepKeywordType_CONJUNCTION, + "Мөн ": messages.StepKeywordType_CONJUNCTION, + "Тэгээд ": messages.StepKeywordType_CONJUNCTION, "Гэхдээ ": messages.StepKeywordType_CONJUNCTION, - "Харин ": messages.StepKeywordType_CONJUNCTION, + + "Харин ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -3234,15 +3375,19 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "दिइएको ": messages.StepKeywordType_CONTEXT, - "दिएको ": messages.StepKeywordType_CONTEXT, - "यदि ": messages.StepKeywordType_CONTEXT, + + "दिएको ": messages.StepKeywordType_CONTEXT, + + "यदि ": messages.StepKeywordType_CONTEXT, "जब ": messages.StepKeywordType_ACTION, "त्यसपछि ": messages.StepKeywordType_OUTCOME, - "अनी ": messages.StepKeywordType_OUTCOME, - "र ": messages.StepKeywordType_CONJUNCTION, + "अनी ": messages.StepKeywordType_OUTCOME, + + "र ": messages.StepKeywordType_CONJUNCTION, + "अनि ": messages.StepKeywordType_CONJUNCTION, "तर ": messages.StepKeywordType_CONJUNCTION, @@ -3295,9 +3440,11 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Gegeven ": messages.StepKeywordType_CONTEXT, - "Stel ": messages.StepKeywordType_CONTEXT, - "Als ": messages.StepKeywordType_ACTION, + "Stel ": messages.StepKeywordType_CONTEXT, + + "Als ": messages.StepKeywordType_ACTION, + "Wanneer ": messages.StepKeywordType_ACTION, "Dan ": messages.StepKeywordType_OUTCOME, @@ -3411,7 +3558,8 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "ਜੇਕਰ ": messages.StepKeywordType_CONTEXT, + "ਜੇਕਰ ": messages.StepKeywordType_CONTEXT, + "ਜਿਵੇਂ ਕਿ ": messages.StepKeywordType_CONTEXT, "ਜਦੋਂ ": messages.StepKeywordType_ACTION, @@ -3477,19 +3625,25 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Zakładając ": messages.StepKeywordType_CONTEXT, - "Mając ": messages.StepKeywordType_CONTEXT, + "Zakładając ": messages.StepKeywordType_CONTEXT, + + "Mając ": messages.StepKeywordType_CONTEXT, + "Zakładając, że ": messages.StepKeywordType_CONTEXT, "Jeżeli ": messages.StepKeywordType_ACTION, - "Jeśli ": messages.StepKeywordType_ACTION, - "Gdy ": messages.StepKeywordType_ACTION, - "Kiedy ": messages.StepKeywordType_ACTION, + + "Jeśli ": messages.StepKeywordType_ACTION, + + "Gdy ": messages.StepKeywordType_ACTION, + + "Kiedy ": messages.StepKeywordType_ACTION, "Wtedy ": messages.StepKeywordType_OUTCOME, "Oraz ": messages.StepKeywordType_CONJUNCTION, - "I ": messages.StepKeywordType_CONJUNCTION, + + "I ": messages.StepKeywordType_CONJUNCTION, "Ale ": messages.StepKeywordType_CONJUNCTION, @@ -3553,14 +3707,18 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Dado ": messages.StepKeywordType_CONTEXT, - "Dada ": messages.StepKeywordType_CONTEXT, + "Dado ": messages.StepKeywordType_CONTEXT, + + "Dada ": messages.StepKeywordType_CONTEXT, + "Dados ": messages.StepKeywordType_CONTEXT, + "Dadas ": messages.StepKeywordType_CONTEXT, "Quando ": messages.StepKeywordType_ACTION, "Então ": messages.StepKeywordType_OUTCOME, + "Entao ": messages.StepKeywordType_OUTCOME, "E ": messages.StepKeywordType_CONJUNCTION, @@ -3624,19 +3782,27 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Date fiind ": messages.StepKeywordType_CONTEXT, - "Dat fiind ": messages.StepKeywordType_CONTEXT, - "Dată fiind": messages.StepKeywordType_CONTEXT, + + "Dat fiind ": messages.StepKeywordType_CONTEXT, + + "Dată fiind": messages.StepKeywordType_CONTEXT, + "Dati fiind ": messages.StepKeywordType_CONTEXT, + "Dați fiind ": messages.StepKeywordType_CONTEXT, + "Daţi fiind ": messages.StepKeywordType_CONTEXT, "Cand ": messages.StepKeywordType_ACTION, + "Când ": messages.StepKeywordType_ACTION, "Atunci ": messages.StepKeywordType_OUTCOME, "Si ": messages.StepKeywordType_CONJUNCTION, + "Și ": messages.StepKeywordType_CONJUNCTION, + "Şi ": messages.StepKeywordType_CONJUNCTION, "Dar ": messages.StepKeywordType_CONJUNCTION, @@ -3702,22 +3868,31 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Допустим ": messages.StepKeywordType_CONTEXT, - "Дано ": messages.StepKeywordType_CONTEXT, - "Пусть ": messages.StepKeywordType_CONTEXT, + + "Дано ": messages.StepKeywordType_CONTEXT, + + "Пусть ": messages.StepKeywordType_CONTEXT, "Когда ": messages.StepKeywordType_ACTION, - "Если ": messages.StepKeywordType_ACTION, - "То ": messages.StepKeywordType_OUTCOME, + "Если ": messages.StepKeywordType_ACTION, + + "То ": messages.StepKeywordType_OUTCOME, + "Затем ": messages.StepKeywordType_OUTCOME, + "Тогда ": messages.StepKeywordType_OUTCOME, - "И ": messages.StepKeywordType_CONJUNCTION, + "И ": messages.StepKeywordType_CONJUNCTION, + "К тому же ": messages.StepKeywordType_CONJUNCTION, - "Также ": messages.StepKeywordType_CONJUNCTION, - "Но ": messages.StepKeywordType_CONJUNCTION, - "А ": messages.StepKeywordType_CONJUNCTION, + "Также ": messages.StepKeywordType_CONJUNCTION, + + "Но ": messages.StepKeywordType_CONJUNCTION, + + "А ": messages.StepKeywordType_CONJUNCTION, + "Иначе ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, @@ -3775,18 +3950,24 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Pokiaľ ": messages.StepKeywordType_CONTEXT, + "Pokiaľ ": messages.StepKeywordType_CONTEXT, + "Za predpokladu ": messages.StepKeywordType_CONTEXT, "Keď ": messages.StepKeywordType_ACTION, - "Ak ": messages.StepKeywordType_ACTION, - "Tak ": messages.StepKeywordType_OUTCOME, + "Ak ": messages.StepKeywordType_ACTION, + + "Tak ": messages.StepKeywordType_OUTCOME, + "Potom ": messages.StepKeywordType_OUTCOME, - "A ": messages.StepKeywordType_CONJUNCTION, - "A tiež ": messages.StepKeywordType_CONJUNCTION, + "A ": messages.StepKeywordType_CONJUNCTION, + + "A tiež ": messages.StepKeywordType_CONJUNCTION, + "A taktiež ": messages.StepKeywordType_CONJUNCTION, + "A zároveň ": messages.StepKeywordType_CONJUNCTION, "Ale ": messages.StepKeywordType_CONJUNCTION, @@ -3854,25 +4035,36 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Dano ": messages.StepKeywordType_CONTEXT, - "Podano ": messages.StepKeywordType_CONTEXT, - "Zaradi ": messages.StepKeywordType_CONTEXT, + "Dano ": messages.StepKeywordType_CONTEXT, + + "Podano ": messages.StepKeywordType_CONTEXT, + + "Zaradi ": messages.StepKeywordType_CONTEXT, + "Privzeto ": messages.StepKeywordType_CONTEXT, - "Ko ": messages.StepKeywordType_ACTION, - "Ce ": messages.StepKeywordType_ACTION, - "Če ": messages.StepKeywordType_ACTION, + "Ko ": messages.StepKeywordType_ACTION, + + "Ce ": messages.StepKeywordType_ACTION, + + "Če ": messages.StepKeywordType_ACTION, + "Kadar ": messages.StepKeywordType_ACTION, - "Nato ": messages.StepKeywordType_OUTCOME, - "Potem ": messages.StepKeywordType_OUTCOME, + "Nato ": messages.StepKeywordType_OUTCOME, + + "Potem ": messages.StepKeywordType_OUTCOME, + "Takrat ": messages.StepKeywordType_OUTCOME, - "In ": messages.StepKeywordType_CONJUNCTION, + "In ": messages.StepKeywordType_CONJUNCTION, + "Ter ": messages.StepKeywordType_CONJUNCTION, - "Toda ": messages.StepKeywordType_CONJUNCTION, - "Ampak ": messages.StepKeywordType_CONJUNCTION, + "Toda ": messages.StepKeywordType_CONJUNCTION, + + "Ampak ": messages.StepKeywordType_CONJUNCTION, + "Vendar ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, @@ -3932,11 +4124,14 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "За дато ": messages.StepKeywordType_CONTEXT, + "За дате ": messages.StepKeywordType_CONTEXT, + "За дати ": messages.StepKeywordType_CONTEXT, "Када ": messages.StepKeywordType_ACTION, - "Кад ": messages.StepKeywordType_ACTION, + + "Кад ": messages.StepKeywordType_ACTION, "Онда ": messages.StepKeywordType_OUTCOME, @@ -4001,11 +4196,14 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Za dato ": messages.StepKeywordType_CONTEXT, + "Za date ": messages.StepKeywordType_CONTEXT, + "Za dati ": messages.StepKeywordType_CONTEXT, "Kada ": messages.StepKeywordType_ACTION, - "Kad ": messages.StepKeywordType_ACTION, + + "Kad ": messages.StepKeywordType_ACTION, "Onda ": messages.StepKeywordType_OUTCOME, @@ -4126,6 +4324,7 @@ var builtinDialects = gherkinDialectMap{ "அப்பொழுது ": messages.StepKeywordType_OUTCOME, "மேலும் ": messages.StepKeywordType_CONJUNCTION, + "மற்றும் ": messages.StepKeywordType_CONJUNCTION, "ஆனால் ": messages.StepKeywordType_CONJUNCTION, @@ -4295,18 +4494,21 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "ghu' noblu' ": messages.StepKeywordType_CONTEXT, + "ghu' noblu' ": messages.StepKeywordType_CONTEXT, + "DaH ghu' bejlu' ": messages.StepKeywordType_CONTEXT, "qaSDI' ": messages.StepKeywordType_ACTION, "vaj ": messages.StepKeywordType_OUTCOME, - "'ej ": messages.StepKeywordType_CONJUNCTION, + "'ej ": messages.StepKeywordType_CONJUNCTION, + "latlh ": messages.StepKeywordType_CONJUNCTION, "'ach ": messages.StepKeywordType_CONJUNCTION, - "'a ": messages.StepKeywordType_CONJUNCTION, + + "'a ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -4363,7 +4565,8 @@ var builtinDialects = gherkinDialectMap{ "Ve ": messages.StepKeywordType_CONJUNCTION, "Fakat ": messages.StepKeywordType_CONJUNCTION, - "Ama ": messages.StepKeywordType_CONJUNCTION, + + "Ama ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -4420,10 +4623,12 @@ var builtinDialects = gherkinDialectMap{ "Нәтиҗәдә ": messages.StepKeywordType_OUTCOME, "Һәм ": messages.StepKeywordType_CONJUNCTION, - "Вә ": messages.StepKeywordType_CONJUNCTION, + + "Вә ": messages.StepKeywordType_CONJUNCTION, "Ләкин ": messages.StepKeywordType_CONJUNCTION, - "Әмма ": messages.StepKeywordType_CONJUNCTION, + + "Әмма ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -4477,20 +4682,27 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "Припустимо ": messages.StepKeywordType_CONTEXT, + "Припустимо ": messages.StepKeywordType_CONTEXT, + "Припустимо, що ": messages.StepKeywordType_CONTEXT, - "Нехай ": messages.StepKeywordType_CONTEXT, - "Дано ": messages.StepKeywordType_CONTEXT, + + "Нехай ": messages.StepKeywordType_CONTEXT, + + "Дано ": messages.StepKeywordType_CONTEXT, "Якщо ": messages.StepKeywordType_ACTION, + "Коли ": messages.StepKeywordType_ACTION, - "То ": messages.StepKeywordType_OUTCOME, + "То ": messages.StepKeywordType_OUTCOME, + "Тоді ": messages.StepKeywordType_OUTCOME, - "І ": messages.StepKeywordType_CONJUNCTION, + "І ": messages.StepKeywordType_CONJUNCTION, + "А також ": messages.StepKeywordType_CONJUNCTION, - "Та ": messages.StepKeywordType_CONJUNCTION, + + "Та ": messages.StepKeywordType_CONJUNCTION, "Але ": messages.StepKeywordType_CONJUNCTION, @@ -4543,14 +4755,17 @@ var builtinDialects = gherkinDialectMap{ }, }, map[string]messages.StepKeywordType{ - "اگر ": messages.StepKeywordType_CONTEXT, - "بالفرض ": messages.StepKeywordType_CONTEXT, + "اگر ": messages.StepKeywordType_CONTEXT, + + "بالفرض ": messages.StepKeywordType_CONTEXT, + "فرض کیا ": messages.StepKeywordType_CONTEXT, "جب ": messages.StepKeywordType_ACTION, "پھر ": messages.StepKeywordType_OUTCOME, - "تب ": messages.StepKeywordType_OUTCOME, + + "تب ": messages.StepKeywordType_OUTCOME, "اور ": messages.StepKeywordType_CONJUNCTION, @@ -4611,8 +4826,10 @@ var builtinDialects = gherkinDialectMap{ "Ва ": messages.StepKeywordType_CONJUNCTION, "Лекин ": messages.StepKeywordType_CONJUNCTION, + "Бирок ": messages.StepKeywordType_CONJUNCTION, - "Аммо ": messages.StepKeywordType_CONJUNCTION, + + "Аммо ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, }}, @@ -4662,7 +4879,8 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "Biết ": messages.StepKeywordType_CONTEXT, - "Cho ": messages.StepKeywordType_CONTEXT, + + "Cho ": messages.StepKeywordType_CONTEXT, "Khi ": messages.StepKeywordType_ACTION, @@ -4724,7 +4942,9 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "假如": messages.StepKeywordType_CONTEXT, + "假设": messages.StepKeywordType_CONTEXT, + "假定": messages.StepKeywordType_CONTEXT, "当": messages.StepKeywordType_ACTION, @@ -4732,7 +4952,9 @@ var builtinDialects = gherkinDialectMap{ "那么": messages.StepKeywordType_OUTCOME, "而且": messages.StepKeywordType_CONJUNCTION, + "并且": messages.StepKeywordType_CONJUNCTION, + "同时": messages.StepKeywordType_CONJUNCTION, "但是": messages.StepKeywordType_CONJUNCTION, @@ -4788,7 +5010,9 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "假如": messages.StepKeywordType_CONTEXT, + "假設": messages.StepKeywordType_CONTEXT, + "假定": messages.StepKeywordType_CONTEXT, "當": messages.StepKeywordType_ACTION, @@ -4796,7 +5020,9 @@ var builtinDialects = gherkinDialectMap{ "那麼": messages.StepKeywordType_OUTCOME, "而且": messages.StepKeywordType_CONJUNCTION, + "並且": messages.StepKeywordType_CONJUNCTION, + "同時": messages.StepKeywordType_CONJUNCTION, "但是": messages.StepKeywordType_CONJUNCTION, @@ -4851,17 +5077,21 @@ var builtinDialects = gherkinDialectMap{ }, map[string]messages.StepKeywordType{ "जर": messages.StepKeywordType_CONTEXT, + "दिलेल्या प्रमाणे ": messages.StepKeywordType_CONTEXT, "जेव्हा ": messages.StepKeywordType_ACTION, - "मग ": messages.StepKeywordType_OUTCOME, + "मग ": messages.StepKeywordType_OUTCOME, + "तेव्हा ": messages.StepKeywordType_OUTCOME, - "आणि ": messages.StepKeywordType_CONJUNCTION, + "आणि ": messages.StepKeywordType_CONJUNCTION, + "तसेच ": messages.StepKeywordType_CONJUNCTION, - "पण ": messages.StepKeywordType_CONJUNCTION, + "पण ": messages.StepKeywordType_CONJUNCTION, + "परंतु ": messages.StepKeywordType_CONJUNCTION, "* ": messages.StepKeywordType_UNKNOWN, diff --git a/go/dialects_builtin.go.jq b/go/dialects_builtin.go.jq index f29c9004b..09990a8f7 100644 --- a/go/dialects_builtin.go.jq +++ b/go/dialects_builtin.go.jq @@ -14,73 +14,73 @@ ] ) + [ "\t\t},\n", - "map[string]messages.StepKeywordType {\n" + "\t\tmap[string]messages.StepKeywordType{\n" ] + ( [ .value.given | ( [ .[] | select(. != "* ") | - "\t\t\t\t", + "\t\t\t", @json, ": messages.StepKeywordType_CONTEXT", - ",\n" + ",\n\n" ] | add ), - "\t\t\t\n" + "" ] + [ .value.when | ( [ .[] | select(. != "* ") | - "\t\t\t\t", + "\t\t\t", @json, ": messages.StepKeywordType_ACTION", - ",\n" + ",\n\n" ] | add ), - "\t\t\t\n" + "" ] + [ .value.then | ( [ .[] | select(. != "* ") | - "\t\t\t\t", + "\t\t\t", @json, ": messages.StepKeywordType_OUTCOME", - ",\n" + ",\n\n" ] | add ), - "\t\t\t\n" + "" ] + [ .value.and | ( [ .[] | select(. != "* ") | - "\t\t\t\t", + "\t\t\t", @json, ": messages.StepKeywordType_CONJUNCTION", - ",\n" + ",\n\n" ] | add ), - "\t\t\t\n" + "" ] + [ .value.but | ( [ .[] | select(. != "* ") | - "\t\t\t\t", + "\t\t\t", @json, ": messages.StepKeywordType_CONJUNCTION", - ",\n" + ",\n\n" ] | add ), - "\t\t\t\n" + "" ] + [ - "\"* \": messages.StepKeywordType_UNKNOWN,\n" + "\t\t\t\"* \": messages.StepKeywordType_UNKNOWN,\n" ] ) + [ - "}", - "\t},\n" + "\t\t}", + "},\n" ] | add ] @@ -93,11 +93,18 @@ + "\treturn builtinDialects\n" + "}\n\n" + "const (\n" -+ ( - ["feature","rule","background","scenario","scenarioOutline","examples","given","when","then","and","but"] - | [ .[] | "\t" + . + " = " + (.|@json) + "\n" ] - | add ) ++ " feature = \"feature\"\n" ++ " rule = \"rule\"\n" ++ " background = \"background\"\n" ++ " scenario = \"scenario\"\n" ++ " scenarioOutline = \"scenarioOutline\"\n" ++ " examples = \"examples\"\n" ++ " given = \"given\"\n" ++ " when = \"when\"\n" ++ " then = \"then\"\n" ++ " and = \"and\"\n" ++ " but = \"but\"\n" + ")\n\n" + "var builtinDialects = gherkinDialectMap{\n" + . -+ "}\n" ++ "}" diff --git a/go/gherkin-languages.json b/go/gherkin-languages.json deleted file mode 100644 index 279a4d89a..000000000 --- a/go/gherkin-languages.json +++ /dev/null @@ -1,3741 +0,0 @@ -{ - "af": { - "and": [ - "* ", - "En " - ], - "background": [ - "Agtergrond" - ], - "but": [ - "* ", - "Maar " - ], - "examples": [ - "Voorbeelde" - ], - "feature": [ - "Funksie", - "Besigheid Behoefte", - "Vermoë" - ], - "given": [ - "* ", - "Gegewe " - ], - "name": "Afrikaans", - "native": "Afrikaans", - "rule": [ - "Regel" - ], - "scenario": [ - "Voorbeeld", - "Situasie" - ], - "scenarioOutline": [ - "Situasie Uiteensetting" - ], - "then": [ - "* ", - "Dan " - ], - "when": [ - "* ", - "Wanneer " - ] - }, - "am": { - "and": [ - "* ", - "Եվ " - ], - "background": [ - "Կոնտեքստ" - ], - "but": [ - "* ", - "Բայց " - ], - "examples": [ - "Օրինակներ" - ], - "feature": [ - "Ֆունկցիոնալություն", - "Հատկություն" - ], - "given": [ - "* ", - "Դիցուք " - ], - "name": "Armenian", - "native": "հայերեն", - "rule": [ - "Rule" - ], - "scenario": [ - "Օրինակ", - "Սցենար" - ], - "scenarioOutline": [ - "Սցենարի կառուցվացքը" - ], - "then": [ - "* ", - "Ապա " - ], - "when": [ - "* ", - "Եթե ", - "Երբ " - ] - }, - "an": { - "and": [ - "* ", - "Y ", - "E " - ], - "background": [ - "Antecedents" - ], - "but": [ - "* ", - "Pero " - ], - "examples": [ - "Eixemplos" - ], - "feature": [ - "Caracteristica" - ], - "given": [ - "* ", - "Dau ", - "Dada ", - "Daus ", - "Dadas " - ], - "name": "Aragonese", - "native": "Aragonés", - "rule": [ - "Rule" - ], - "scenario": [ - "Eixemplo", - "Caso" - ], - "scenarioOutline": [ - "Esquema del caso" - ], - "then": [ - "* ", - "Alavez ", - "Allora ", - "Antonces " - ], - "when": [ - "* ", - "Cuan " - ] - }, - "ar": { - "and": [ - "* ", - "و " - ], - "background": [ - "الخلفية" - ], - "but": [ - "* ", - "لكن " - ], - "examples": [ - "امثلة" - ], - "feature": [ - "خاصية" - ], - "given": [ - "* ", - "بفرض " - ], - "name": "Arabic", - "native": "العربية", - "rule": [ - "Rule" - ], - "scenario": [ - "مثال", - "سيناريو" - ], - "scenarioOutline": [ - "سيناريو مخطط" - ], - "then": [ - "* ", - "اذاً ", - "ثم " - ], - "when": [ - "* ", - "متى ", - "عندما " - ] - }, - "ast": { - "and": [ - "* ", - "Y ", - "Ya " - ], - "background": [ - "Antecedentes" - ], - "but": [ - "* ", - "Peru " - ], - "examples": [ - "Exemplos" - ], - "feature": [ - "Carauterística" - ], - "given": [ - "* ", - "Dáu ", - "Dada ", - "Daos ", - "Daes " - ], - "name": "Asturian", - "native": "asturianu", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemplo", - "Casu" - ], - "scenarioOutline": [ - "Esbozu del casu" - ], - "then": [ - "* ", - "Entós " - ], - "when": [ - "* ", - "Cuando " - ] - }, - "az": { - "and": [ - "* ", - "Və ", - "Həm " - ], - "background": [ - "Keçmiş", - "Kontekst" - ], - "but": [ - "* ", - "Amma ", - "Ancaq " - ], - "examples": [ - "Nümunələr" - ], - "feature": [ - "Özəllik" - ], - "given": [ - "* ", - "Tutaq ki ", - "Verilir " - ], - "name": "Azerbaijani", - "native": "Azərbaycanca", - "rule": [ - "Rule" - ], - "scenario": [ - "Nümunə", - "Ssenari" - ], - "scenarioOutline": [ - "Ssenarinin strukturu" - ], - "then": [ - "* ", - "O halda " - ], - "when": [ - "* ", - "Əgər ", - "Nə vaxt ki " - ] - }, - "bg": { - "and": [ - "* ", - "И " - ], - "background": [ - "Предистория" - ], - "but": [ - "* ", - "Но " - ], - "examples": [ - "Примери" - ], - "feature": [ - "Функционалност" - ], - "given": [ - "* ", - "Дадено " - ], - "name": "Bulgarian", - "native": "български", - "rule": [ - "Правило" - ], - "scenario": [ - "Пример", - "Сценарий" - ], - "scenarioOutline": [ - "Рамка на сценарий" - ], - "then": [ - "* ", - "То " - ], - "when": [ - "* ", - "Когато " - ] - }, - "bm": { - "and": [ - "* ", - "Dan " - ], - "background": [ - "Latar Belakang" - ], - "but": [ - "* ", - "Tetapi ", - "Tapi " - ], - "examples": [ - "Contoh" - ], - "feature": [ - "Fungsi" - ], - "given": [ - "* ", - "Diberi ", - "Bagi " - ], - "name": "Malay", - "native": "Bahasa Melayu", - "rule": [ - "Rule" - ], - "scenario": [ - "Senario", - "Situasi", - "Keadaan" - ], - "scenarioOutline": [ - "Kerangka Senario", - "Kerangka Situasi", - "Kerangka Keadaan", - "Garis Panduan Senario" - ], - "then": [ - "* ", - "Maka ", - "Kemudian " - ], - "when": [ - "* ", - "Apabila " - ] - }, - "bs": { - "and": [ - "* ", - "I ", - "A " - ], - "background": [ - "Pozadina" - ], - "but": [ - "* ", - "Ali " - ], - "examples": [ - "Primjeri" - ], - "feature": [ - "Karakteristika" - ], - "given": [ - "* ", - "Dato " - ], - "name": "Bosnian", - "native": "Bosanski", - "rule": [ - "Rule" - ], - "scenario": [ - "Primjer", - "Scenariju", - "Scenario" - ], - "scenarioOutline": [ - "Scenariju-obris", - "Scenario-outline" - ], - "then": [ - "* ", - "Zatim " - ], - "when": [ - "* ", - "Kada " - ] - }, - "ca": { - "and": [ - "* ", - "I " - ], - "background": [ - "Rerefons", - "Antecedents" - ], - "but": [ - "* ", - "Però " - ], - "examples": [ - "Exemples" - ], - "feature": [ - "Característica", - "Funcionalitat" - ], - "given": [ - "* ", - "Donat ", - "Donada ", - "Atès ", - "Atesa " - ], - "name": "Catalan", - "native": "català", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemple", - "Escenari" - ], - "scenarioOutline": [ - "Esquema de l'escenari" - ], - "then": [ - "* ", - "Aleshores ", - "Cal " - ], - "when": [ - "* ", - "Quan " - ] - }, - "cs": { - "and": [ - "* ", - "A také ", - "A " - ], - "background": [ - "Pozadí", - "Kontext" - ], - "but": [ - "* ", - "Ale " - ], - "examples": [ - "Příklady" - ], - "feature": [ - "Požadavek" - ], - "given": [ - "* ", - "Pokud ", - "Za předpokladu " - ], - "name": "Czech", - "native": "Česky", - "rule": [ - "Pravidlo" - ], - "scenario": [ - "Příklad", - "Scénář" - ], - "scenarioOutline": [ - "Náčrt Scénáře", - "Osnova scénáře" - ], - "then": [ - "* ", - "Pak " - ], - "when": [ - "* ", - "Když " - ] - }, - "cy-GB": { - "and": [ - "* ", - "A " - ], - "background": [ - "Cefndir" - ], - "but": [ - "* ", - "Ond " - ], - "examples": [ - "Enghreifftiau" - ], - "feature": [ - "Arwedd" - ], - "given": [ - "* ", - "Anrhegedig a " - ], - "name": "Welsh", - "native": "Cymraeg", - "rule": [ - "Rule" - ], - "scenario": [ - "Enghraifft", - "Scenario" - ], - "scenarioOutline": [ - "Scenario Amlinellol" - ], - "then": [ - "* ", - "Yna " - ], - "when": [ - "* ", - "Pryd " - ] - }, - "da": { - "and": [ - "* ", - "Og " - ], - "background": [ - "Baggrund" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Eksempler" - ], - "feature": [ - "Egenskab" - ], - "given": [ - "* ", - "Givet " - ], - "name": "Danish", - "native": "dansk", - "rule": [ - "Rule" - ], - "scenario": [ - "Eksempel", - "Scenarie" - ], - "scenarioOutline": [ - "Abstrakt Scenario" - ], - "then": [ - "* ", - "Så " - ], - "when": [ - "* ", - "Når " - ] - }, - "de": { - "and": [ - "* ", - "Und " - ], - "background": [ - "Grundlage", - "Hintergrund", - "Voraussetzungen", - "Vorbedingungen" - ], - "but": [ - "* ", - "Aber " - ], - "examples": [ - "Beispiele" - ], - "feature": [ - "Funktionalität", - "Funktion" - ], - "given": [ - "* ", - "Angenommen ", - "Gegeben sei ", - "Gegeben seien " - ], - "name": "German", - "native": "Deutsch", - "rule": [ - "Rule", - "Regel" - ], - "scenario": [ - "Beispiel", - "Szenario" - ], - "scenarioOutline": [ - "Szenariogrundriss", - "Szenarien" - ], - "then": [ - "* ", - "Dann " - ], - "when": [ - "* ", - "Wenn " - ] - }, - "el": { - "and": [ - "* ", - "Και " - ], - "background": [ - "Υπόβαθρο" - ], - "but": [ - "* ", - "Αλλά " - ], - "examples": [ - "Παραδείγματα", - "Σενάρια" - ], - "feature": [ - "Δυνατότητα", - "Λειτουργία" - ], - "given": [ - "* ", - "Δεδομένου " - ], - "name": "Greek", - "native": "Ελληνικά", - "rule": [ - "Rule" - ], - "scenario": [ - "Παράδειγμα", - "Σενάριο" - ], - "scenarioOutline": [ - "Περιγραφή Σεναρίου", - "Περίγραμμα Σεναρίου" - ], - "then": [ - "* ", - "Τότε " - ], - "when": [ - "* ", - "Όταν " - ] - }, - "em": { - "and": [ - "* ", - "😂" - ], - "background": [ - "💤" - ], - "but": [ - "* ", - "😔" - ], - "examples": [ - "📓" - ], - "feature": [ - "📚" - ], - "given": [ - "* ", - "😐" - ], - "name": "Emoji", - "native": "😀", - "rule": [ - "Rule" - ], - "scenario": [ - "🥒", - "📕" - ], - "scenarioOutline": [ - "📖" - ], - "then": [ - "* ", - "🙏" - ], - "when": [ - "* ", - "🎬" - ] - }, - "en": { - "and": [ - "* ", - "And " - ], - "background": [ - "Background" - ], - "but": [ - "* ", - "But " - ], - "examples": [ - "Examples", - "Scenarios" - ], - "feature": [ - "Feature", - "Business Need", - "Ability" - ], - "given": [ - "* ", - "Given " - ], - "name": "English", - "native": "English", - "rule": [ - "Rule" - ], - "scenario": [ - "Example", - "Scenario" - ], - "scenarioOutline": [ - "Scenario Outline", - "Scenario Template" - ], - "then": [ - "* ", - "Then " - ], - "when": [ - "* ", - "When " - ] - }, - "en-Scouse": { - "and": [ - "* ", - "An " - ], - "background": [ - "Dis is what went down" - ], - "but": [ - "* ", - "Buh " - ], - "examples": [ - "Examples" - ], - "feature": [ - "Feature" - ], - "given": [ - "* ", - "Givun ", - "Youse know when youse got " - ], - "name": "Scouse", - "native": "Scouse", - "rule": [ - "Rule" - ], - "scenario": [ - "The thing of it is" - ], - "scenarioOutline": [ - "Wharrimean is" - ], - "then": [ - "* ", - "Dun ", - "Den youse gotta " - ], - "when": [ - "* ", - "Wun ", - "Youse know like when " - ] - }, - "en-au": { - "and": [ - "* ", - "Too right " - ], - "background": [ - "First off" - ], - "but": [ - "* ", - "Yeah nah " - ], - "examples": [ - "You'll wanna" - ], - "feature": [ - "Pretty much" - ], - "given": [ - "* ", - "Y'know " - ], - "name": "Australian", - "native": "Australian", - "rule": [ - "Rule" - ], - "scenario": [ - "Awww, look mate" - ], - "scenarioOutline": [ - "Reckon it's like" - ], - "then": [ - "* ", - "But at the end of the day I reckon " - ], - "when": [ - "* ", - "It's just unbelievable " - ] - }, - "en-lol": { - "and": [ - "* ", - "AN " - ], - "background": [ - "B4" - ], - "but": [ - "* ", - "BUT " - ], - "examples": [ - "EXAMPLZ" - ], - "feature": [ - "OH HAI" - ], - "given": [ - "* ", - "I CAN HAZ " - ], - "name": "LOLCAT", - "native": "LOLCAT", - "rule": [ - "Rule" - ], - "scenario": [ - "MISHUN" - ], - "scenarioOutline": [ - "MISHUN SRSLY" - ], - "then": [ - "* ", - "DEN " - ], - "when": [ - "* ", - "WEN " - ] - }, - "en-old": { - "and": [ - "* ", - "Ond ", - "7 " - ], - "background": [ - "Aer", - "Ær" - ], - "but": [ - "* ", - "Ac " - ], - "examples": [ - "Se the", - "Se þe", - "Se ðe" - ], - "feature": [ - "Hwaet", - "Hwæt" - ], - "given": [ - "* ", - "Thurh ", - "Þurh ", - "Ðurh " - ], - "name": "Old English", - "native": "Englisc", - "rule": [ - "Rule" - ], - "scenario": [ - "Swa" - ], - "scenarioOutline": [ - "Swa hwaer swa", - "Swa hwær swa" - ], - "then": [ - "* ", - "Tha ", - "Þa ", - "Ða ", - "Tha the ", - "Þa þe ", - "Ða ðe " - ], - "when": [ - "* ", - "Bæþsealf ", - "Bæþsealfa ", - "Bæþsealfe ", - "Ciricæw ", - "Ciricæwe ", - "Ciricæwa " - ] - }, - "en-pirate": { - "and": [ - "* ", - "Aye " - ], - "background": [ - "Yo-ho-ho" - ], - "but": [ - "* ", - "Avast! " - ], - "examples": [ - "Dead men tell no tales" - ], - "feature": [ - "Ahoy matey!" - ], - "given": [ - "* ", - "Gangway! " - ], - "name": "Pirate", - "native": "Pirate", - "rule": [ - "Rule" - ], - "scenario": [ - "Heave to" - ], - "scenarioOutline": [ - "Shiver me timbers" - ], - "then": [ - "* ", - "Let go and haul " - ], - "when": [ - "* ", - "Blimey! " - ] - }, - "en-tx": { - "and": [ - "Come hell or high water " - ], - "background": [ - "Lemme tell y'all a story" - ], - "but": [ - "Well now hold on, I'll you what " - ], - "examples": [ - "Now that's a story longer than a cattle drive in July" - ], - "feature": [ - "This ain’t my first rodeo", - "All gussied up" - ], - "given": [ - "Fixin' to ", - "All git out " - ], - "name": "Texas", - "native": "Texas", - "rule": [ - "Rule " - ], - "scenario": [ - "All hat and no cattle" - ], - "scenarioOutline": [ - "Serious as a snake bite", - "Busy as a hound in flea season" - ], - "then": [ - "There’s no tree but bears some fruit " - ], - "when": [ - "Quick out of the chute " - ] - }, - "eo": { - "and": [ - "* ", - "Kaj " - ], - "background": [ - "Fono" - ], - "but": [ - "* ", - "Sed " - ], - "examples": [ - "Ekzemploj" - ], - "feature": [ - "Trajto" - ], - "given": [ - "* ", - "Donitaĵo ", - "Komence " - ], - "name": "Esperanto", - "native": "Esperanto", - "rule": [ - "Rule" - ], - "scenario": [ - "Ekzemplo", - "Scenaro", - "Kazo" - ], - "scenarioOutline": [ - "Konturo de la scenaro", - "Skizo", - "Kazo-skizo" - ], - "then": [ - "* ", - "Do " - ], - "when": [ - "* ", - "Se " - ] - }, - "es": { - "and": [ - "* ", - "Y ", - "E " - ], - "background": [ - "Antecedentes" - ], - "but": [ - "* ", - "Pero " - ], - "examples": [ - "Ejemplos" - ], - "feature": [ - "Característica", - "Necesidad del negocio", - "Requisito" - ], - "given": [ - "* ", - "Dado ", - "Dada ", - "Dados ", - "Dadas " - ], - "name": "Spanish", - "native": "español", - "rule": [ - "Regla", - "Regla de negocio" - ], - "scenario": [ - "Ejemplo", - "Escenario" - ], - "scenarioOutline": [ - "Esquema del escenario" - ], - "then": [ - "* ", - "Entonces " - ], - "when": [ - "* ", - "Cuando " - ] - }, - "et": { - "and": [ - "* ", - "Ja " - ], - "background": [ - "Taust" - ], - "but": [ - "* ", - "Kuid " - ], - "examples": [ - "Juhtumid" - ], - "feature": [ - "Omadus" - ], - "given": [ - "* ", - "Eeldades " - ], - "name": "Estonian", - "native": "eesti keel", - "rule": [ - "Reegel" - ], - "scenario": [ - "Juhtum", - "Stsenaarium" - ], - "scenarioOutline": [ - "Raamjuhtum", - "Raamstsenaarium" - ], - "then": [ - "* ", - "Siis " - ], - "when": [ - "* ", - "Kui " - ] - }, - "fa": { - "and": [ - "* ", - "و " - ], - "background": [ - "زمینه" - ], - "but": [ - "* ", - "اما " - ], - "examples": [ - "نمونه ها" - ], - "feature": [ - "وِیژگی" - ], - "given": [ - "* ", - "با فرض " - ], - "name": "Persian", - "native": "فارسی", - "rule": [ - "Rule" - ], - "scenario": [ - "مثال", - "سناریو" - ], - "scenarioOutline": [ - "الگوی سناریو" - ], - "then": [ - "* ", - "آنگاه " - ], - "when": [ - "* ", - "هنگامی " - ] - }, - "fi": { - "and": [ - "* ", - "Ja " - ], - "background": [ - "Tausta" - ], - "but": [ - "* ", - "Mutta " - ], - "examples": [ - "Tapaukset" - ], - "feature": [ - "Ominaisuus" - ], - "given": [ - "* ", - "Oletetaan " - ], - "name": "Finnish", - "native": "suomi", - "rule": [ - "Rule" - ], - "scenario": [ - "Tapaus" - ], - "scenarioOutline": [ - "Tapausaihio" - ], - "then": [ - "* ", - "Niin " - ], - "when": [ - "* ", - "Kun " - ] - }, - "fr": { - "and": [ - "* ", - "Et que ", - "Et qu'", - "Et " - ], - "background": [ - "Contexte" - ], - "but": [ - "* ", - "Mais que ", - "Mais qu'", - "Mais " - ], - "examples": [ - "Exemples" - ], - "feature": [ - "Fonctionnalité" - ], - "given": [ - "* ", - "Soit ", - "Sachant que ", - "Sachant qu'", - "Sachant ", - "Etant donné que ", - "Etant donné qu'", - "Etant donné ", - "Etant donnée ", - "Etant donnés ", - "Etant données ", - "Étant donné que ", - "Étant donné qu'", - "Étant donné ", - "Étant donnée ", - "Étant donnés ", - "Étant données " - ], - "name": "French", - "native": "français", - "rule": [ - "Règle" - ], - "scenario": [ - "Exemple", - "Scénario" - ], - "scenarioOutline": [ - "Plan du scénario", - "Plan du Scénario" - ], - "then": [ - "* ", - "Alors ", - "Donc " - ], - "when": [ - "* ", - "Quand ", - "Lorsque ", - "Lorsqu'" - ] - }, - "ga": { - "and": [ - "* ", - "Agus" - ], - "background": [ - "Cúlra" - ], - "but": [ - "* ", - "Ach" - ], - "examples": [ - "Samplaí" - ], - "feature": [ - "Gné" - ], - "given": [ - "* ", - "Cuir i gcás go", - "Cuir i gcás nach", - "Cuir i gcás gur", - "Cuir i gcás nár" - ], - "name": "Irish", - "native": "Gaeilge", - "rule": [ - "Rule" - ], - "scenario": [ - "Sampla", - "Cás" - ], - "scenarioOutline": [ - "Cás Achomair" - ], - "then": [ - "* ", - "Ansin" - ], - "when": [ - "* ", - "Nuair a", - "Nuair nach", - "Nuair ba", - "Nuair nár" - ] - }, - "gj": { - "and": [ - "* ", - "અને " - ], - "background": [ - "બેકગ્રાઉન્ડ" - ], - "but": [ - "* ", - "પણ " - ], - "examples": [ - "ઉદાહરણો" - ], - "feature": [ - "લક્ષણ", - "વ્યાપાર જરૂર", - "ક્ષમતા" - ], - "given": [ - "* ", - "આપેલ છે " - ], - "name": "Gujarati", - "native": "ગુજરાતી", - "rule": [ - "Rule" - ], - "scenario": [ - "ઉદાહરણ", - "સ્થિતિ" - ], - "scenarioOutline": [ - "પરિદ્દશ્ય રૂપરેખા", - "પરિદ્દશ્ય ઢાંચો" - ], - "then": [ - "* ", - "પછી " - ], - "when": [ - "* ", - "ક્યારે " - ] - }, - "gl": { - "and": [ - "* ", - "E " - ], - "background": [ - "Contexto" - ], - "but": [ - "* ", - "Mais ", - "Pero " - ], - "examples": [ - "Exemplos" - ], - "feature": [ - "Característica" - ], - "given": [ - "* ", - "Dado ", - "Dada ", - "Dados ", - "Dadas " - ], - "name": "Galician", - "native": "galego", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemplo", - "Escenario" - ], - "scenarioOutline": [ - "Esbozo do escenario" - ], - "then": [ - "* ", - "Entón ", - "Logo " - ], - "when": [ - "* ", - "Cando " - ] - }, - "he": { - "and": [ - "* ", - "וגם " - ], - "background": [ - "רקע" - ], - "but": [ - "* ", - "אבל " - ], - "examples": [ - "דוגמאות" - ], - "feature": [ - "תכונה" - ], - "given": [ - "* ", - "בהינתן " - ], - "name": "Hebrew", - "native": "עברית", - "rule": [ - "כלל" - ], - "scenario": [ - "דוגמא", - "תרחיש" - ], - "scenarioOutline": [ - "תבנית תרחיש" - ], - "then": [ - "* ", - "אז ", - "אזי " - ], - "when": [ - "* ", - "כאשר " - ] - }, - "hi": { - "and": [ - "* ", - "और ", - "तथा " - ], - "background": [ - "पृष्ठभूमि" - ], - "but": [ - "* ", - "पर ", - "परन्तु ", - "किन्तु " - ], - "examples": [ - "उदाहरण" - ], - "feature": [ - "रूप लेख" - ], - "given": [ - "* ", - "अगर ", - "यदि ", - "चूंकि " - ], - "name": "Hindi", - "native": "हिंदी", - "rule": [ - "नियम" - ], - "scenario": [ - "परिदृश्य" - ], - "scenarioOutline": [ - "परिदृश्य रूपरेखा" - ], - "then": [ - "* ", - "तब ", - "तदा " - ], - "when": [ - "* ", - "जब ", - "कदा " - ] - }, - "hr": { - "and": [ - "* ", - "I " - ], - "background": [ - "Pozadina" - ], - "but": [ - "* ", - "Ali " - ], - "examples": [ - "Primjeri", - "Scenariji" - ], - "feature": [ - "Osobina", - "Mogućnost", - "Mogucnost" - ], - "given": [ - "* ", - "Zadan ", - "Zadani ", - "Zadano ", - "Ukoliko " - ], - "name": "Croatian", - "native": "hrvatski", - "rule": [ - "Rule" - ], - "scenario": [ - "Primjer", - "Scenarij" - ], - "scenarioOutline": [ - "Skica", - "Koncept" - ], - "then": [ - "* ", - "Onda " - ], - "when": [ - "* ", - "Kada ", - "Kad " - ] - }, - "ht": { - "and": [ - "* ", - "Ak ", - "Epi ", - "E " - ], - "background": [ - "Kontèks", - "Istorik" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Egzanp" - ], - "feature": [ - "Karakteristik", - "Mak", - "Fonksyonalite" - ], - "given": [ - "* ", - "Sipoze ", - "Sipoze ke ", - "Sipoze Ke " - ], - "name": "Creole", - "native": "kreyòl", - "rule": [ - "Rule" - ], - "scenario": [ - "Senaryo" - ], - "scenarioOutline": [ - "Plan senaryo", - "Plan Senaryo", - "Senaryo deskripsyon", - "Senaryo Deskripsyon", - "Dyagram senaryo", - "Dyagram Senaryo" - ], - "then": [ - "* ", - "Lè sa a ", - "Le sa a " - ], - "when": [ - "* ", - "Lè ", - "Le " - ] - }, - "hu": { - "and": [ - "* ", - "És " - ], - "background": [ - "Háttér" - ], - "but": [ - "* ", - "De " - ], - "examples": [ - "Példák" - ], - "feature": [ - "Jellemző" - ], - "given": [ - "* ", - "Amennyiben ", - "Adott " - ], - "name": "Hungarian", - "native": "magyar", - "rule": [ - "Szabály" - ], - "scenario": [ - "Példa", - "Forgatókönyv" - ], - "scenarioOutline": [ - "Forgatókönyv vázlat" - ], - "then": [ - "* ", - "Akkor " - ], - "when": [ - "* ", - "Majd ", - "Ha ", - "Amikor " - ] - }, - "id": { - "and": [ - "* ", - "Dan " - ], - "background": [ - "Dasar", - "Latar Belakang" - ], - "but": [ - "* ", - "Tapi ", - "Tetapi " - ], - "examples": [ - "Contoh", - "Misal" - ], - "feature": [ - "Fitur" - ], - "given": [ - "* ", - "Dengan ", - "Diketahui ", - "Diasumsikan ", - "Bila ", - "Jika " - ], - "name": "Indonesian", - "native": "Bahasa Indonesia", - "rule": [ - "Rule", - "Aturan" - ], - "scenario": [ - "Skenario" - ], - "scenarioOutline": [ - "Skenario konsep", - "Garis-Besar Skenario" - ], - "then": [ - "* ", - "Maka ", - "Kemudian " - ], - "when": [ - "* ", - "Ketika " - ] - }, - "is": { - "and": [ - "* ", - "Og " - ], - "background": [ - "Bakgrunnur" - ], - "but": [ - "* ", - "En " - ], - "examples": [ - "Dæmi", - "Atburðarásir" - ], - "feature": [ - "Eiginleiki" - ], - "given": [ - "* ", - "Ef " - ], - "name": "Icelandic", - "native": "Íslenska", - "rule": [ - "Rule" - ], - "scenario": [ - "Atburðarás" - ], - "scenarioOutline": [ - "Lýsing Atburðarásar", - "Lýsing Dæma" - ], - "then": [ - "* ", - "Þá " - ], - "when": [ - "* ", - "Þegar " - ] - }, - "it": { - "and": [ - "* ", - "E " - ], - "background": [ - "Contesto" - ], - "but": [ - "* ", - "Ma " - ], - "examples": [ - "Esempi" - ], - "feature": [ - "Funzionalità", - "Esigenza di Business", - "Abilità" - ], - "given": [ - "* ", - "Dato ", - "Data ", - "Dati ", - "Date " - ], - "name": "Italian", - "native": "italiano", - "rule": [ - "Regola" - ], - "scenario": [ - "Esempio", - "Scenario" - ], - "scenarioOutline": [ - "Schema dello scenario" - ], - "then": [ - "* ", - "Allora " - ], - "when": [ - "* ", - "Quando " - ] - }, - "ja": { - "and": [ - "* ", - "且つ", - "かつ" - ], - "background": [ - "背景" - ], - "but": [ - "* ", - "然し", - "しかし", - "但し", - "ただし" - ], - "examples": [ - "例", - "サンプル" - ], - "feature": [ - "フィーチャ", - "機能" - ], - "given": [ - "* ", - "前提" - ], - "name": "Japanese", - "native": "日本語", - "rule": [ - "ルール" - ], - "scenario": [ - "シナリオ" - ], - "scenarioOutline": [ - "シナリオアウトライン", - "シナリオテンプレート", - "テンプレ", - "シナリオテンプレ" - ], - "then": [ - "* ", - "ならば" - ], - "when": [ - "* ", - "もし" - ] - }, - "jv": { - "and": [ - "* ", - "Lan " - ], - "background": [ - "Dasar" - ], - "but": [ - "* ", - "Tapi ", - "Nanging ", - "Ananging " - ], - "examples": [ - "Conto", - "Contone" - ], - "feature": [ - "Fitur" - ], - "given": [ - "* ", - "Nalika ", - "Nalikaning " - ], - "name": "Javanese", - "native": "Basa Jawa", - "rule": [ - "Rule" - ], - "scenario": [ - "Skenario" - ], - "scenarioOutline": [ - "Konsep skenario" - ], - "then": [ - "* ", - "Njuk ", - "Banjur " - ], - "when": [ - "* ", - "Manawa ", - "Menawa " - ] - }, - "ka": { - "and": [ - "* ", - "და ", - "ასევე " - ], - "background": [ - "კონტექსტი" - ], - "but": [ - "* ", - "მაგრამ ", - "თუმცა " - ], - "examples": [ - "მაგალითები" - ], - "feature": [ - "თვისება", - "მოთხოვნა" - ], - "given": [ - "* ", - "მოცემული ", - "Მოცემულია ", - "ვთქვათ " - ], - "name": "Georgian", - "native": "ქართული", - "rule": [ - "წესი" - ], - "scenario": [ - "მაგალითად", - "მაგალითი", - "მაგ", - "სცენარი" - ], - "scenarioOutline": [ - "სცენარის ნიმუში", - "სცენარის შაბლონი", - "ნიმუში", - "შაბლონი" - ], - "then": [ - "* ", - "მაშინ " - ], - "when": [ - "* ", - "როდესაც ", - "როცა ", - "როგორც კი ", - "თუ " - ] - }, - "kn": { - "and": [ - "* ", - "ಮತ್ತು " - ], - "background": [ - "ಹಿನ್ನೆಲೆ" - ], - "but": [ - "* ", - "ಆದರೆ " - ], - "examples": [ - "ಉದಾಹರಣೆಗಳು" - ], - "feature": [ - "ಹೆಚ್ಚಳ" - ], - "given": [ - "* ", - "ನೀಡಿದ " - ], - "name": "Kannada", - "native": "ಕನ್ನಡ", - "rule": [ - "Rule" - ], - "scenario": [ - "ಉದಾಹರಣೆ", - "ಕಥಾಸಾರಾಂಶ" - ], - "scenarioOutline": [ - "ವಿವರಣೆ" - ], - "then": [ - "* ", - "ನಂತರ " - ], - "when": [ - "* ", - "ಸ್ಥಿತಿಯನ್ನು " - ] - }, - "ko": { - "and": [ - "* ", - "그리고" - ], - "background": [ - "배경" - ], - "but": [ - "* ", - "하지만", - "단" - ], - "examples": [ - "예" - ], - "feature": [ - "기능" - ], - "given": [ - "* ", - "조건", - "먼저" - ], - "name": "Korean", - "native": "한국어", - "rule": [ - "Rule" - ], - "scenario": [ - "시나리오" - ], - "scenarioOutline": [ - "시나리오 개요" - ], - "then": [ - "* ", - "그러면" - ], - "when": [ - "* ", - "만일", - "만약" - ] - }, - "lt": { - "and": [ - "* ", - "Ir " - ], - "background": [ - "Kontekstas" - ], - "but": [ - "* ", - "Bet " - ], - "examples": [ - "Pavyzdžiai", - "Scenarijai", - "Variantai" - ], - "feature": [ - "Savybė" - ], - "given": [ - "* ", - "Duota " - ], - "name": "Lithuanian", - "native": "lietuvių kalba", - "rule": [ - "Rule" - ], - "scenario": [ - "Pavyzdys", - "Scenarijus" - ], - "scenarioOutline": [ - "Scenarijaus šablonas" - ], - "then": [ - "* ", - "Tada " - ], - "when": [ - "* ", - "Kai " - ] - }, - "lu": { - "and": [ - "* ", - "an ", - "a " - ], - "background": [ - "Hannergrond" - ], - "but": [ - "* ", - "awer ", - "mä " - ], - "examples": [ - "Beispiller" - ], - "feature": [ - "Funktionalitéit" - ], - "given": [ - "* ", - "ugeholl " - ], - "name": "Luxemburgish", - "native": "Lëtzebuergesch", - "rule": [ - "Rule" - ], - "scenario": [ - "Beispill", - "Szenario" - ], - "scenarioOutline": [ - "Plang vum Szenario" - ], - "then": [ - "* ", - "dann " - ], - "when": [ - "* ", - "wann " - ] - }, - "lv": { - "and": [ - "* ", - "Un " - ], - "background": [ - "Konteksts", - "Situācija" - ], - "but": [ - "* ", - "Bet " - ], - "examples": [ - "Piemēri", - "Paraugs" - ], - "feature": [ - "Funkcionalitāte", - "Fīča" - ], - "given": [ - "* ", - "Kad " - ], - "name": "Latvian", - "native": "latviešu", - "rule": [ - "Rule" - ], - "scenario": [ - "Piemērs", - "Scenārijs" - ], - "scenarioOutline": [ - "Scenārijs pēc parauga" - ], - "then": [ - "* ", - "Tad " - ], - "when": [ - "* ", - "Ja " - ] - }, - "mk-Cyrl": { - "and": [ - "* ", - "И " - ], - "background": [ - "Контекст", - "Содржина" - ], - "but": [ - "* ", - "Но " - ], - "examples": [ - "Примери", - "Сценарија" - ], - "feature": [ - "Функционалност", - "Бизнис потреба", - "Можност" - ], - "given": [ - "* ", - "Дадено ", - "Дадена " - ], - "name": "Macedonian", - "native": "Македонски", - "rule": [ - "Rule" - ], - "scenario": [ - "Пример", - "Сценарио", - "На пример" - ], - "scenarioOutline": [ - "Преглед на сценарија", - "Скица", - "Концепт" - ], - "then": [ - "* ", - "Тогаш " - ], - "when": [ - "* ", - "Кога " - ] - }, - "mk-Latn": { - "and": [ - "* ", - "I " - ], - "background": [ - "Kontekst", - "Sodrzhina" - ], - "but": [ - "* ", - "No " - ], - "examples": [ - "Primeri", - "Scenaria" - ], - "feature": [ - "Funkcionalnost", - "Biznis potreba", - "Mozhnost" - ], - "given": [ - "* ", - "Dadeno ", - "Dadena " - ], - "name": "Macedonian (Latin)", - "native": "Makedonski (Latinica)", - "rule": [ - "Rule" - ], - "scenario": [ - "Scenario", - "Na primer" - ], - "scenarioOutline": [ - "Pregled na scenarija", - "Skica", - "Koncept" - ], - "then": [ - "* ", - "Togash " - ], - "when": [ - "* ", - "Koga " - ] - }, - "mn": { - "and": [ - "* ", - "Мөн ", - "Тэгээд " - ], - "background": [ - "Агуулга" - ], - "but": [ - "* ", - "Гэхдээ ", - "Харин " - ], - "examples": [ - "Тухайлбал" - ], - "feature": [ - "Функц", - "Функционал" - ], - "given": [ - "* ", - "Өгөгдсөн нь ", - "Анх " - ], - "name": "Mongolian", - "native": "монгол", - "rule": [ - "Rule" - ], - "scenario": [ - "Сценар" - ], - "scenarioOutline": [ - "Сценарын төлөвлөгөө" - ], - "then": [ - "* ", - "Тэгэхэд ", - "Үүний дараа " - ], - "when": [ - "* ", - "Хэрэв " - ] - }, - "ne": { - "and": [ - "* ", - "र ", - "अनि " - ], - "background": [ - "पृष्ठभूमी" - ], - "but": [ - "* ", - "तर " - ], - "examples": [ - "उदाहरण", - "उदाहरणहरु" - ], - "feature": [ - "सुविधा", - "विशेषता" - ], - "given": [ - "* ", - "दिइएको ", - "दिएको ", - "यदि " - ], - "name": "Nepali", - "native": "नेपाली", - "rule": [ - "नियम" - ], - "scenario": [ - "परिदृश्य" - ], - "scenarioOutline": [ - "परिदृश्य रूपरेखा" - ], - "then": [ - "* ", - "त्यसपछि ", - "अनी " - ], - "when": [ - "* ", - "जब " - ] - }, - "nl": { - "and": [ - "* ", - "En " - ], - "background": [ - "Achtergrond" - ], - "but": [ - "* ", - "Maar " - ], - "examples": [ - "Voorbeelden" - ], - "feature": [ - "Functionaliteit" - ], - "given": [ - "* ", - "Gegeven ", - "Stel " - ], - "name": "Dutch", - "native": "Nederlands", - "rule": [ - "Rule" - ], - "scenario": [ - "Voorbeeld", - "Scenario" - ], - "scenarioOutline": [ - "Abstract Scenario" - ], - "then": [ - "* ", - "Dan " - ], - "when": [ - "* ", - "Als ", - "Wanneer " - ] - }, - "no": { - "and": [ - "* ", - "Og " - ], - "background": [ - "Bakgrunn" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Eksempler" - ], - "feature": [ - "Egenskap" - ], - "given": [ - "* ", - "Gitt " - ], - "name": "Norwegian", - "native": "norsk", - "rule": [ - "Regel" - ], - "scenario": [ - "Eksempel", - "Scenario" - ], - "scenarioOutline": [ - "Scenariomal", - "Abstrakt Scenario" - ], - "then": [ - "* ", - "Så " - ], - "when": [ - "* ", - "Når " - ] - }, - "pa": { - "and": [ - "* ", - "ਅਤੇ " - ], - "background": [ - "ਪਿਛੋਕੜ" - ], - "but": [ - "* ", - "ਪਰ " - ], - "examples": [ - "ਉਦਾਹਰਨਾਂ" - ], - "feature": [ - "ਖਾਸੀਅਤ", - "ਮੁਹਾਂਦਰਾ", - "ਨਕਸ਼ ਨੁਹਾਰ" - ], - "given": [ - "* ", - "ਜੇਕਰ ", - "ਜਿਵੇਂ ਕਿ " - ], - "name": "Panjabi", - "native": "ਪੰਜਾਬੀ", - "rule": [ - "Rule" - ], - "scenario": [ - "ਉਦਾਹਰਨ", - "ਪਟਕਥਾ" - ], - "scenarioOutline": [ - "ਪਟਕਥਾ ਢਾਂਚਾ", - "ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ" - ], - "then": [ - "* ", - "ਤਦ " - ], - "when": [ - "* ", - "ਜਦੋਂ " - ] - }, - "pl": { - "and": [ - "* ", - "Oraz ", - "I " - ], - "background": [ - "Założenia" - ], - "but": [ - "* ", - "Ale " - ], - "examples": [ - "Przykłady" - ], - "feature": [ - "Właściwość", - "Funkcja", - "Aspekt", - "Potrzeba biznesowa" - ], - "given": [ - "* ", - "Zakładając ", - "Mając ", - "Zakładając, że " - ], - "name": "Polish", - "native": "polski", - "rule": [ - "Zasada", - "Reguła" - ], - "scenario": [ - "Przykład", - "Scenariusz" - ], - "scenarioOutline": [ - "Szablon scenariusza" - ], - "then": [ - "* ", - "Wtedy " - ], - "when": [ - "* ", - "Jeżeli ", - "Jeśli ", - "Gdy ", - "Kiedy " - ] - }, - "pt": { - "and": [ - "* ", - "E " - ], - "background": [ - "Contexto", - "Cenário de Fundo", - "Cenario de Fundo", - "Fundo" - ], - "but": [ - "* ", - "Mas " - ], - "examples": [ - "Exemplos", - "Cenários", - "Cenarios" - ], - "feature": [ - "Funcionalidade", - "Característica", - "Caracteristica" - ], - "given": [ - "* ", - "Dado ", - "Dada ", - "Dados ", - "Dadas " - ], - "name": "Portuguese", - "native": "português", - "rule": [ - "Regra" - ], - "scenario": [ - "Exemplo", - "Cenário", - "Cenario" - ], - "scenarioOutline": [ - "Esquema do Cenário", - "Esquema do Cenario", - "Delineação do Cenário", - "Delineacao do Cenario" - ], - "then": [ - "* ", - "Então ", - "Entao " - ], - "when": [ - "* ", - "Quando " - ] - }, - "ro": { - "and": [ - "* ", - "Si ", - "Și ", - "Şi " - ], - "background": [ - "Context" - ], - "but": [ - "* ", - "Dar " - ], - "examples": [ - "Exemple" - ], - "feature": [ - "Functionalitate", - "Funcționalitate", - "Funcţionalitate" - ], - "given": [ - "* ", - "Date fiind ", - "Dat fiind ", - "Dată fiind", - "Dati fiind ", - "Dați fiind ", - "Daţi fiind " - ], - "name": "Romanian", - "native": "română", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemplu", - "Scenariu" - ], - "scenarioOutline": [ - "Structura scenariu", - "Structură scenariu" - ], - "then": [ - "* ", - "Atunci " - ], - "when": [ - "* ", - "Cand ", - "Când " - ] - }, - "ru": { - "and": [ - "* ", - "И ", - "К тому же ", - "Также " - ], - "background": [ - "Предыстория", - "Контекст" - ], - "but": [ - "* ", - "Но ", - "А ", - "Иначе " - ], - "examples": [ - "Примеры" - ], - "feature": [ - "Функция", - "Функциональность", - "Функционал", - "Свойство", - "Фича" - ], - "given": [ - "* ", - "Допустим ", - "Дано ", - "Пусть " - ], - "name": "Russian", - "native": "русский", - "rule": [ - "Правило" - ], - "scenario": [ - "Пример", - "Сценарий" - ], - "scenarioOutline": [ - "Структура сценария", - "Шаблон сценария" - ], - "then": [ - "* ", - "То ", - "Затем ", - "Тогда " - ], - "when": [ - "* ", - "Когда ", - "Если " - ] - }, - "sk": { - "and": [ - "* ", - "A ", - "A tiež ", - "A taktiež ", - "A zároveň " - ], - "background": [ - "Pozadie" - ], - "but": [ - "* ", - "Ale " - ], - "examples": [ - "Príklady" - ], - "feature": [ - "Požiadavka", - "Funkcia", - "Vlastnosť" - ], - "given": [ - "* ", - "Pokiaľ ", - "Za predpokladu " - ], - "name": "Slovak", - "native": "Slovensky", - "rule": [ - "Rule" - ], - "scenario": [ - "Príklad", - "Scenár" - ], - "scenarioOutline": [ - "Náčrt Scenáru", - "Náčrt Scenára", - "Osnova Scenára" - ], - "then": [ - "* ", - "Tak ", - "Potom " - ], - "when": [ - "* ", - "Keď ", - "Ak " - ] - }, - "sl": { - "and": [ - "In ", - "Ter " - ], - "background": [ - "Kontekst", - "Osnova", - "Ozadje" - ], - "but": [ - "Toda ", - "Ampak ", - "Vendar " - ], - "examples": [ - "Primeri", - "Scenariji" - ], - "feature": [ - "Funkcionalnost", - "Funkcija", - "Možnosti", - "Moznosti", - "Lastnost", - "Značilnost" - ], - "given": [ - "Dano ", - "Podano ", - "Zaradi ", - "Privzeto " - ], - "name": "Slovenian", - "native": "Slovenski", - "rule": [ - "Rule" - ], - "scenario": [ - "Primer", - "Scenarij" - ], - "scenarioOutline": [ - "Struktura scenarija", - "Skica", - "Koncept", - "Oris scenarija", - "Osnutek" - ], - "then": [ - "Nato ", - "Potem ", - "Takrat " - ], - "when": [ - "Ko ", - "Ce ", - "Če ", - "Kadar " - ] - }, - "sr-Cyrl": { - "and": [ - "* ", - "И " - ], - "background": [ - "Контекст", - "Основа", - "Позадина" - ], - "but": [ - "* ", - "Али " - ], - "examples": [ - "Примери", - "Сценарији" - ], - "feature": [ - "Функционалност", - "Могућност", - "Особина" - ], - "given": [ - "* ", - "За дато ", - "За дате ", - "За дати " - ], - "name": "Serbian", - "native": "Српски", - "rule": [ - "Правило" - ], - "scenario": [ - "Пример", - "Сценарио", - "Пример" - ], - "scenarioOutline": [ - "Структура сценарија", - "Скица", - "Концепт" - ], - "then": [ - "* ", - "Онда " - ], - "when": [ - "* ", - "Када ", - "Кад " - ] - }, - "sr-Latn": { - "and": [ - "* ", - "I " - ], - "background": [ - "Kontekst", - "Osnova", - "Pozadina" - ], - "but": [ - "* ", - "Ali " - ], - "examples": [ - "Primeri", - "Scenariji" - ], - "feature": [ - "Funkcionalnost", - "Mogućnost", - "Mogucnost", - "Osobina" - ], - "given": [ - "* ", - "Za dato ", - "Za date ", - "Za dati " - ], - "name": "Serbian (Latin)", - "native": "Srpski (Latinica)", - "rule": [ - "Pravilo" - ], - "scenario": [ - "Scenario", - "Primer" - ], - "scenarioOutline": [ - "Struktura scenarija", - "Skica", - "Koncept" - ], - "then": [ - "* ", - "Onda " - ], - "when": [ - "* ", - "Kada ", - "Kad " - ] - }, - "sv": { - "and": [ - "* ", - "Och " - ], - "background": [ - "Bakgrund" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Exempel" - ], - "feature": [ - "Egenskap" - ], - "given": [ - "* ", - "Givet " - ], - "name": "Swedish", - "native": "Svenska", - "rule": [ - "Regel" - ], - "scenario": [ - "Scenario" - ], - "scenarioOutline": [ - "Abstrakt Scenario", - "Scenariomall" - ], - "then": [ - "* ", - "Så " - ], - "when": [ - "* ", - "När " - ] - }, - "ta": { - "and": [ - "* ", - "மேலும் ", - "மற்றும் " - ], - "background": [ - "பின்னணி" - ], - "but": [ - "* ", - "ஆனால் " - ], - "examples": [ - "எடுத்துக்காட்டுகள்", - "காட்சிகள்", - "நிலைமைகளில்" - ], - "feature": [ - "அம்சம்", - "வணிக தேவை", - "திறன்" - ], - "given": [ - "* ", - "கொடுக்கப்பட்ட " - ], - "name": "Tamil", - "native": "தமிழ்", - "rule": [ - "Rule" - ], - "scenario": [ - "உதாரணமாக", - "காட்சி" - ], - "scenarioOutline": [ - "காட்சி சுருக்கம்", - "காட்சி வார்ப்புரு" - ], - "then": [ - "* ", - "அப்பொழுது " - ], - "when": [ - "* ", - "எப்போது " - ] - }, - "th": { - "and": [ - "* ", - "และ " - ], - "background": [ - "แนวคิด" - ], - "but": [ - "* ", - "แต่ " - ], - "examples": [ - "ชุดของตัวอย่าง", - "ชุดของเหตุการณ์" - ], - "feature": [ - "โครงหลัก", - "ความต้องการทางธุรกิจ", - "ความสามารถ" - ], - "given": [ - "* ", - "กำหนดให้ " - ], - "name": "Thai", - "native": "ไทย", - "rule": [ - "Rule" - ], - "scenario": [ - "เหตุการณ์" - ], - "scenarioOutline": [ - "สรุปเหตุการณ์", - "โครงสร้างของเหตุการณ์" - ], - "then": [ - "* ", - "ดังนั้น " - ], - "when": [ - "* ", - "เมื่อ " - ] - }, - "te": { - "and": [ - "* ", - "మరియు " - ], - "background": [ - "నేపథ్యం" - ], - "but": [ - "* ", - "కాని " - ], - "examples": [ - "ఉదాహరణలు" - ], - "feature": [ - "గుణము" - ], - "given": [ - "* ", - "చెప్పబడినది " - ], - "name": "Telugu", - "native": "తెలుగు", - "rule": [ - "Rule" - ], - "scenario": [ - "ఉదాహరణ", - "సన్నివేశం" - ], - "scenarioOutline": [ - "కథనం" - ], - "then": [ - "* ", - "అప్పుడు " - ], - "when": [ - "* ", - "ఈ పరిస్థితిలో " - ] - }, - "tlh": { - "and": [ - "* ", - "'ej ", - "latlh " - ], - "background": [ - "mo'" - ], - "but": [ - "* ", - "'ach ", - "'a " - ], - "examples": [ - "ghantoH", - "lutmey" - ], - "feature": [ - "Qap", - "Qu'meH 'ut", - "perbogh", - "poQbogh malja'", - "laH" - ], - "given": [ - "* ", - "ghu' noblu' ", - "DaH ghu' bejlu' " - ], - "name": "Klingon", - "native": "tlhIngan", - "rule": [ - "Rule" - ], - "scenario": [ - "lut" - ], - "scenarioOutline": [ - "lut chovnatlh" - ], - "then": [ - "* ", - "vaj " - ], - "when": [ - "* ", - "qaSDI' " - ] - }, - "tr": { - "and": [ - "* ", - "Ve " - ], - "background": [ - "Geçmiş" - ], - "but": [ - "* ", - "Fakat ", - "Ama " - ], - "examples": [ - "Örnekler" - ], - "feature": [ - "Özellik" - ], - "given": [ - "* ", - "Diyelim ki " - ], - "name": "Turkish", - "native": "Türkçe", - "rule": [ - "Kural" - ], - "scenario": [ - "Örnek", - "Senaryo" - ], - "scenarioOutline": [ - "Senaryo taslağı" - ], - "then": [ - "* ", - "O zaman " - ], - "when": [ - "* ", - "Eğer ki " - ] - }, - "tt": { - "and": [ - "* ", - "Һәм ", - "Вә " - ], - "background": [ - "Кереш" - ], - "but": [ - "* ", - "Ләкин ", - "Әмма " - ], - "examples": [ - "Үрнәкләр", - "Мисаллар" - ], - "feature": [ - "Мөмкинлек", - "Үзенчәлеклелек" - ], - "given": [ - "* ", - "Әйтик " - ], - "name": "Tatar", - "native": "Татарча", - "rule": [ - "Rule" - ], - "scenario": [ - "Сценарий" - ], - "scenarioOutline": [ - "Сценарийның төзелеше" - ], - "then": [ - "* ", - "Нәтиҗәдә " - ], - "when": [ - "* ", - "Әгәр " - ] - }, - "uk": { - "and": [ - "* ", - "І ", - "А також ", - "Та " - ], - "background": [ - "Передумова" - ], - "but": [ - "* ", - "Але " - ], - "examples": [ - "Приклади" - ], - "feature": [ - "Функціонал" - ], - "given": [ - "* ", - "Припустимо ", - "Припустимо, що ", - "Нехай ", - "Дано " - ], - "name": "Ukrainian", - "native": "Українська", - "rule": [ - "Rule" - ], - "scenario": [ - "Приклад", - "Сценарій" - ], - "scenarioOutline": [ - "Структура сценарію" - ], - "then": [ - "* ", - "То ", - "Тоді " - ], - "when": [ - "* ", - "Якщо ", - "Коли " - ] - }, - "ur": { - "and": [ - "* ", - "اور " - ], - "background": [ - "پس منظر" - ], - "but": [ - "* ", - "لیکن " - ], - "examples": [ - "مثالیں" - ], - "feature": [ - "صلاحیت", - "کاروبار کی ضرورت", - "خصوصیت" - ], - "given": [ - "* ", - "اگر ", - "بالفرض ", - "فرض کیا " - ], - "name": "Urdu", - "native": "اردو", - "rule": [ - "Rule" - ], - "scenario": [ - "منظرنامہ" - ], - "scenarioOutline": [ - "منظر نامے کا خاکہ" - ], - "then": [ - "* ", - "پھر ", - "تب " - ], - "when": [ - "* ", - "جب " - ] - }, - "uz": { - "and": [ - "* ", - "Ва " - ], - "background": [ - "Тарих" - ], - "but": [ - "* ", - "Лекин ", - "Бирок ", - "Аммо " - ], - "examples": [ - "Мисоллар" - ], - "feature": [ - "Функционал" - ], - "given": [ - "* ", - "Belgilangan " - ], - "name": "Uzbek", - "native": "Узбекча", - "rule": [ - "Rule" - ], - "scenario": [ - "Сценарий" - ], - "scenarioOutline": [ - "Сценарий структураси" - ], - "then": [ - "* ", - "Унда " - ], - "when": [ - "* ", - "Агар " - ] - }, - "vi": { - "and": [ - "* ", - "Và " - ], - "background": [ - "Bối cảnh" - ], - "but": [ - "* ", - "Nhưng " - ], - "examples": [ - "Dữ liệu" - ], - "feature": [ - "Tính năng" - ], - "given": [ - "* ", - "Biết ", - "Cho " - ], - "name": "Vietnamese", - "native": "Tiếng Việt", - "rule": [ - "Rule" - ], - "scenario": [ - "Tình huống", - "Kịch bản" - ], - "scenarioOutline": [ - "Khung tình huống", - "Khung kịch bản" - ], - "then": [ - "* ", - "Thì " - ], - "when": [ - "* ", - "Khi " - ] - }, - "zh-CN": { - "and": [ - "* ", - "而且", - "并且", - "同时" - ], - "background": [ - "背景" - ], - "but": [ - "* ", - "但是" - ], - "examples": [ - "例子" - ], - "feature": [ - "功能" - ], - "given": [ - "* ", - "假如", - "假设", - "假定" - ], - "name": "Chinese simplified", - "native": "简体中文", - "rule": [ - "Rule", - "规则" - ], - "scenario": [ - "场景", - "剧本" - ], - "scenarioOutline": [ - "场景大纲", - "剧本大纲" - ], - "then": [ - "* ", - "那么" - ], - "when": [ - "* ", - "当" - ] - }, - "zh-TW": { - "and": [ - "* ", - "而且", - "並且", - "同時" - ], - "background": [ - "背景" - ], - "but": [ - "* ", - "但是" - ], - "examples": [ - "例子" - ], - "feature": [ - "功能" - ], - "given": [ - "* ", - "假如", - "假設", - "假定" - ], - "name": "Chinese traditional", - "native": "繁體中文", - "rule": [ - "Rule" - ], - "scenario": [ - "場景", - "劇本" - ], - "scenarioOutline": [ - "場景大綱", - "劇本大綱" - ], - "then": [ - "* ", - "那麼" - ], - "when": [ - "* ", - "當" - ] - }, - "mr": { - "and": [ - "* ", - "आणि ", - "तसेच " - ], - "background": [ - "पार्श्वभूमी" - ], - "but": [ - "* ", - "पण ", - "परंतु " - ], - "examples": [ - "उदाहरण" - ], - "feature": [ - "वैशिष्ट्य", - "सुविधा" - ], - "given": [ - "* ", - "जर", - "दिलेल्या प्रमाणे " - ], - "name": "Marathi", - "native": "मराठी", - "rule": [ - "नियम" - ], - "scenario": [ - "परिदृश्य" - ], - "scenarioOutline": [ - "परिदृश्य रूपरेखा" - ], - "then": [ - "* ", - "मग ", - "तेव्हा " - ], - "when": [ - "* ", - "जेव्हा " - ] - }, - "amh": { - "and": [ - "* ", - "እና " - ], - "background": [ - "ቅድመ ሁኔታ", - "መነሻ", - "መነሻ ሀሳብ" - ], - "but": [ - "* ", - "ግን " - ], - "examples": [ - "ምሳሌዎች", - "ሁናቴዎች" - ], - "feature": [ - "ስራ", - "የተፈለገው ስራ", - "የሚፈለገው ድርጊት" - ], - "given": [ - "* ", - "የተሰጠ " - ], - "name": "Amharic", - "native": "አማርኛ", - "rule": [ - "ህግ" - ], - "scenario": [ - "ምሳሌ", - "ሁናቴ" - ], - "scenarioOutline": [ - "ሁናቴ ዝርዝር", - "ሁናቴ አብነት" - ], - "then": [ - "* ", - "ከዚያ " - ], - "when": [ - "* ", - "መቼ " - ] - } -} diff --git a/go/gherkin.berp b/go/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/go/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/go/go.mod b/go/go.mod index 350fa9289..d4d4eec61 100644 --- a/go/go.mod +++ b/go/go.mod @@ -7,7 +7,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/gofrs/uuid v4.3.0+incompatible // indirect + github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go/go.sum b/go/go.sum index 9c090b838..da93ac485 100644 --- a/go/go.sum +++ b/go/go.sum @@ -3,9 +3,8 @@ github.com/cucumber/common/messages/go/v19 v19.1.2/go.mod h1:0KLDvMVmmkEZcWUSKxF github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.3.0+incompatible h1:CaSVZxm5B+7o45rtab4jC2G37WGYX1zQfuU2i6DSvnc= -github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/go/parser.go.razor b/go/parser.go.razor index 18447f099..7b173db1f 100644 --- a/go/parser.go.razor +++ b/go/parser.go.razor @@ -41,7 +41,6 @@ // // This file is generated. Do not edit! Edit parser.go.razor instead. -// package gherkin import ( diff --git a/go/scripts/github-release b/go/scripts/github-release deleted file mode 100755 index c580fd352..000000000 --- a/go/scripts/github-release +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -# -# Creates a GitHub release and uploads all the executables -# -set -euf -o pipefail - -version=$1 -libname=$(basename $(dirname $(pwd))) -git_tag_name=${libname}/go -exe_base_name=cucumber-${libname} -add_args=$(find dist -type f -name "${exe_base_name}-*" | \ - # Replace newline with space - tr '\n' ' ' | \ - # Remove trailing space - sed -e 's/[[:space:]]*$//' | \ - # Insert ' -a ' between all files - sed "s/[[:space:]]/ -a /g") - -eval hub release create \ - --attach ${add_args} \ - --message "${git_tag_name}/v${version}" "${git_tag_name}/v${version}" diff --git a/java/.github/ISSUE_TEMPLATE.md b/java/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/java/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/java/.github/PULL_REQUEST_TEMPLATE.md b/java/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/java/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/java/.rsync b/java/.rsync deleted file mode 100644 index a4298587a..000000000 --- a/java/.rsync +++ /dev/null @@ -1,4 +0,0 @@ -../LICENSE LICENSE -../../.templates/github/ .github/ -../../.templates/java/ . -../gherkin.berp gherkin.berp diff --git a/java/.subrepo b/java/.subrepo deleted file mode 100644 index 80103e750..000000000 --- a/java/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-java diff --git a/java/CONTRIBUTING.md b/java/CONTRIBUTING.md index c69f6788d..9a5cb370a 100644 --- a/java/CONTRIBUTING.md +++ b/java/CONTRIBUTING.md @@ -1,16 +1,14 @@ -Please read [CONTRIBUTING](https://github.com/cucumber/common/blob/main/CONTRIBUTING.md) first. -You should clone the [cucumber/cucumber](https://github.com/cucumber/cucumber) repo if you want -to contribute. +Please read [CONTRIBUTING](https://github.com/cucumber/gherkin/blob/main/CONTRIBUTING.md) first. ## Run tests ### Using make -Just run `make` from this directory. +Run `make` from this directory. -### Using just Maven +### Using only Maven -Just run `mvn clean test` from this directory. +JRun `mvn clean test` from this directory. Keep in mind that this will only run unit tests. The acceptance tests are only run when you build with `make`. diff --git a/java/LICENSE b/java/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/java/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/java/Makefile b/java/Makefile index 57b2ba5d4..2a0a66c59 100644 --- a/java/Makefile +++ b/java/Makefile @@ -1,4 +1,11 @@ -include default.mk +SHELL := /usr/bin/env bash + +GHERKIN_PARSER = src/main/java/io/cucumber/gherkin/Parser.java +GHERKIN_RAZOR = gherkin-java.razor +SOURCE_FILES = $(shell find . -name "*.java" | grep -v $(GHERKIN_PARSER)) + +GHERKIN = bin/gherkin +GHERKIN_GENERATE_TOKENS = bin/gherkin-generate-tokens GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature") BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature") @@ -9,45 +16,61 @@ PICKLES = $(patsubst ../testdata/%,acceptance/testdata/%.pickles.ndjson,$(G SOURCES = $(patsubst ../testdata/%,acceptance/testdata/%.source.ndjson,$(GOOD_FEATURE_FILES)) ERRORS = $(patsubst ../testdata/%,acceptance/testdata/%.errors.ndjson,$(BAD_FEATURE_FILES)) -.DELETE_ON_ERROR: +.DEFAULT_GOAL = help + +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) -default: .compared +generate: $(GHERKIN_PARSER) ## Generate gherkin parser files -.deps: src/main/java/io/cucumber/gherkin/Parser.java +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) -src/main/java/io/cucumber/gherkin/Parser.java: gherkin-java.razor gherkin.berp - $(berp-generate-parser) +copy-gherkin-languages: + echo "Nothing to do" -.compared: $(TOKENS) $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + echo "Nothing to do" + +clean: ## Remove all build artifacts and files generated by the acceptance tests + rm -rf .built + rm -rf acceptance + rm -rf target + +.DELETE_ON_ERROR: + +acceptance: .built $(TOKENS) $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) ## Build acceptance test dir and compare results with reference + +.built: target/gherkin-*.jar $(SOURCE_FILES) touch $@ -acceptance/testdata/%.tokens: ../testdata/% ../testdata/%.tokens .built +target/gherkin-*.jar: + mvn package + +$(GHERKIN_PARSER): $(GHERKIN_RAZOR) ../gherkin.berp + berp -g ../gherkin.berp -t $< -o $@ --noBOM + +acceptance/testdata/%.tokens: ../testdata/% ../testdata/%.tokens mkdir -p $(@D) - bin/gherkin-generate-tokens $< > $@ + $(GHERKIN_GENERATE_TOKENS) $< > $@ diff --unified $<.tokens $@ -acceptance/testdata/%.ast.ndjson: ../testdata/% ../testdata/%.ast.ndjson .built +acceptance/testdata/%.ast.ndjson: ../testdata/% ../testdata/%.ast.ndjson mkdir -p $(@D) - bin/gherkin --no-source --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.ast.ndjson) <(jq "." $@) -acceptance/testdata/%.pickles.ndjson: ../testdata/% ../testdata/%.pickles.ndjson .built +acceptance/testdata/%.pickles.ndjson: ../testdata/% ../testdata/%.pickles.ndjson mkdir -p $(@D) - bin/gherkin --no-source --no-ast --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-ast --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.pickles.ndjson) <(jq "." $@) -acceptance/testdata/%.source.ndjson: ../testdata/% ../testdata/%.source.ndjson .built +acceptance/testdata/%.source.ndjson: ../testdata/% ../testdata/%.source.ndjson mkdir -p $(@D) - bin/gherkin --no-ast --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-ast --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) -acceptance/testdata/%.errors.ndjson: ../testdata/% ../testdata/%.errors.ndjson .built +acceptance/testdata/%.errors.ndjson: ../testdata/% ../testdata/%.errors.ndjson mkdir -p $(@D) - bin/gherkin --no-source --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) - -clean: - rm -rf .compared acceptance bin/classpath.txt - -clobber: clean - rm -f src/main/java/io/cucumber/gherkin/Parser.java diff --git a/java/default.mk b/java/default.mk deleted file mode 100644 index ca398124a..000000000 --- a/java/default.mk +++ /dev/null @@ -1,77 +0,0 @@ -# Please update /.templates/java/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -JAVA_SOURCE_FILES = $(shell find . -name "*.java") -IS_TESTDATA = $(findstring -testdata,${CURDIR}) - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: .tested -.PHONY: default - -.codegen: - touch $@ - -.tested: .tested-jar-check - -.tested-jar-check: .deps .built - ./scripts/check-jar.sh $(JAR) - touch $@ - -.built: pom.xml $(JAVA_SOURCE_FILES) .codegen - mvn install - touch $@ - -.deps: - touch $@ - -update-dependencies: - mvn versions:force-releases - mvn versions:use-latest-versions -Dmaven.version.rules=file://$(shell pwd)/maven-versions-rules.xml - ruby scripts/set_version_ranges.rb -.PHONY: update-dependencies - -pre-release: update-version update-dependencies clean default -.PHONY: pre-release - -update-version: -ifdef NEW_VERSION - mvn versions:set -DnewVersion=$(NEW_VERSION) -DgenerateBackupPoms=false -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-version - -publish: .deps -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else - mvn deploy -Psign-source-javadoc -DskipTests=true -endif -.PHONY: publish - -post-release: - scripts/post-release.sh -.PHONY: post-release - -clean: clean-java -.PHONY: clean - -clean-java: - rm -rf target .deps .tested* .built acceptance .codegen - mvn clean -.PHONY: clean-java - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/java/gherkin.berp b/java/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/java/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/java/maven-versions-rules.xml b/java/maven-versions-rules.xml deleted file mode 100644 index 947b2b8bc..000000000 --- a/java/maven-versions-rules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - .*pr.* - .*-rc.* - .*-M\d+ - - diff --git a/java/scripts/check-jar.sh b/java/scripts/check-jar.sh deleted file mode 100755 index 7bc1ec824..000000000 --- a/java/scripts/check-jar.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash -# -# Verifies that the jar doesn't have any non-"io.cucumber" classes. This might happen -# if some dependencies are shaded, but some are forgotten. -# -set -uf -o pipefail - -check_jar() { - jar="$1" - module_name=$(xmlstarlet sel -N pom="http://maven.apache.org/POM/4.0.0" -t -m "//pom:project.Automatic-Module-Name" -v . pom.xml) - module_path=$(echo $module_name | sed "s/\./\\\\\//g" | sed "s/-/\\\\\//g") - echo "Checking contents of ${jar} to see if it matches pattern: ${module_path}" - unshaded_classes=$(unzip -l ${jar} | grep -e "\.class" | rev | cut -d' ' -f1 | rev | grep -v "^$module_path") - if [[ "${unshaded_classes}" != "" ]]; then - echo "Some classes in ${jar} are not in the expected package matching pattern ${module_path}. Rename the classes or change the maven-shade-plugin configuration." - echo - echo "${unshaded_classes}" - exit 1 - fi -} - -find . -name "*.jar" | while read jar; do - check_jar "${jar}" -done \ No newline at end of file diff --git a/java/scripts/post-release.sh b/java/scripts/post-release.sh deleted file mode 100755 index a1273033e..000000000 --- a/java/scripts/post-release.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -# -# Bumps the patch version and appends -SNAPSHOT -# -set -uf -o pipefail - -# Finding current version in Changelog is way simpler, as there may be multiple nodes in pom.xml -# Also extracting version with maven itself is a bit tedious -if [[ $(cat "../CHANGELOG.md") =~ \[([0-9]+).([0-9]+).([0-9]+)\] ]]; then - MAJOR="${BASH_REMATCH[1]}" - MINOR="${BASH_REMATCH[2]}" - PATCH="${BASH_REMATCH[3]}" - - NEW_VERSION="$MAJOR.$MINOR.$(( PATCH + 1))-SNAPSHOT" - mvn versions:set -DnewVersion=$NEW_VERSION -DgenerateBackupPoms=false - echo "Updated version in pom.xml to $NEW_VERSION" -else - echo "Unable to find current version in CHANGELOG, please update pom.xml manually" - echo "Bump the patch version in the `pom.xml` and append `-SNAPSHOT` to it." - exit 1 -fi diff --git a/java/scripts/set_version_ranges.rb b/java/scripts/set_version_ranges.rb deleted file mode 100644 index 82d7748d6..000000000 --- a/java/scripts/set_version_ranges.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'nokogiri' - -pom = File.open("pom.xml") { |f| Nokogiri::XML(f) } - -versions = pom.xpath("//xmlns:dependency/xmlns:version[../xmlns:groupId/text() = 'io.cucumber']") -versions.each do |version| - return version unless version.content =~ /^\d+\.\d+\.\d+$/ - major, minor, patch = version.content.split('.').map {|i| i.to_i} - version.content = "[#{major}.#{minor}.#{patch},#{major+1}.0.0)" -end - -File.open("pom.xml", "w:UTF-8") { |f| f.write(pom.to_xml) } diff --git a/javascript/.github/ISSUE_TEMPLATE.md b/javascript/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/javascript/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/javascript/.github/PULL_REQUEST_TEMPLATE.md b/javascript/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/javascript/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/javascript/.gitignore b/javascript/.gitignore index 385b67bb2..9db46532d 100644 --- a/javascript/.gitignore +++ b/javascript/.gitignore @@ -4,7 +4,6 @@ dist/ coverage/ node_modules/ yarn.lock -package-lock.json *.log .deps .tested* diff --git a/javascript/.npmignore b/javascript/.npmignore index b25496bb4..64976ca0f 100644 --- a/javascript/.npmignore +++ b/javascript/.npmignore @@ -1,4 +1,3 @@ -berp test testdata Makefile \ No newline at end of file diff --git a/javascript/.rsync b/javascript/.rsync deleted file mode 100644 index a1dfe9740..000000000 --- a/javascript/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../LICENSE LICENSE -../../.templates/github/ .github/ -../../.templates/javascript/ . -../gherkin.berp gherkin.berp -../gherkin-languages.json src/gherkin-languages.json diff --git a/javascript/.subrepo b/javascript/.subrepo deleted file mode 100644 index d56a444f8..000000000 --- a/javascript/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-javascript diff --git a/javascript/LICENSE b/javascript/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/javascript/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/javascript/Makefile b/javascript/Makefile index e906e91fc..1403bb31f 100644 --- a/javascript/Makefile +++ b/javascript/Makefile @@ -1,4 +1,11 @@ -include default.mk +SHELL := /usr/bin/env bash + +GHERKIN_LANGUAGES_JSON = src/gherkin-languages.json +GHERKIN_PARSER = src/Parser.ts +GHERKIN_RAZOR = gherkin-javascript.razor +SOURCE_FILES = $(shell find . -name "*.js" | grep -v $(GHERKIN_PARSER)) + +GHERKIN = npx gherkin-javascript GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature" -o -name "*.feature.md") BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature" -o -name "*.feature.md") @@ -8,56 +15,58 @@ PICKLES = $(patsubst ../testdata/%,acceptance/testdata/%.pickles.ndjson,$(G SOURCES = $(patsubst ../testdata/%,acceptance/testdata/%.source.ndjson,$(GOOD_FEATURE_FILES)) ERRORS = $(patsubst ../testdata/%,acceptance/testdata/%.errors.ndjson,$(BAD_FEATURE_FILES)) -GHERKIN = npx gherkin-javascript +.DEFAULT_GOAL = help -.DELETE_ON_ERROR: +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +generate: $(GHERKIN_PARSER) ## Generate gherkin parser files + +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) + +copy-gherkin-languages: $(GHERKIN_LANGUAGES_JSON) ## Copy gherkin-languages.json and/or generate derived files -.codegen: src/Parser.ts +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + rm -f $(GHERKIN_LANGUAGES_JSON) -src/Parser.ts: gherkin-javascript.razor gherkin.berp - $(berp-generate-parser) +clean: ## Remove all build artifacts and files generated by the acceptance tests + rm -rf .built + rm -rf acceptance + rm -rf node_modules + +.DELETE_ON_ERROR: -.tested: .compared +acceptance: .built $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) ## Build acceptance test dir and compare results with reference -.compared: $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) +.built: node_modules $(SOURCE_FILES) touch $@ +node_modules: + npm install + +$(GHERKIN_PARSER): $(GHERKIN_RAZOR) ../gherkin.berp + berp -g ../gherkin.berp -t $< -o $@ --noBOM + +$(GHERKIN_LANGUAGES_JSON): + cp ../gherkin-languages.json $@ + acceptance/testdata/%.ast.ndjson: ../testdata/% ../testdata/%.ast.ndjson mkdir -p $(@D) $(GHERKIN) --no-source --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ -ifndef GOLDEN diff --unified <(jq "." $<.ast.ndjson) <(jq "." $@) -else - cp $@ $(word 2,$^) -endif acceptance/testdata/%.pickles.ndjson: ../testdata/% ../testdata/%.pickles.ndjson mkdir -p $(@D) $(GHERKIN) --no-source --no-ast --predictable-ids $< | jq --sort-keys --compact-output "." > $@ -ifndef GOLDEN diff --unified <(jq "." $<.pickles.ndjson) <(jq "." $@) -else - cp $@ $(word 2,$^) -endif acceptance/testdata/%.source.ndjson: ../testdata/% ../testdata/%.source.ndjson mkdir -p $(@D) $(GHERKIN) --no-ast --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ -ifndef GOLDEN diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) -else - cp $@ $(word 2,$^) -endif acceptance/testdata/%.errors.ndjson: ../testdata/% ../testdata/%.errors.ndjson mkdir -p $(@D) $(GHERKIN) --no-source --predictable-ids $< | jq --sort-keys --compact-output "." > $@ -ifndef GOLDEN diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) -else - cp $@ $(word 2,$^) -endif - -clean: - rm -rf acceptance -.PHONY: clean diff --git a/javascript/README.md b/javascript/README.md index 229e70172..4b06d9a0b 100644 --- a/javascript/README.md +++ b/javascript/README.md @@ -1,7 +1,3 @@ # Gherkin for JavaScript -Gherkin parser/compiler for JavaScript. Please see [Gherkin](https://github.com/cucumber/common/tree/main/gherkin) for details. - -## Usage - -Typical usage is via [the `gherkin-streams` package](../../gherkin-streams/javascript). +Gherkin parser/compiler for JavaScript. Please see [Gherkin](https://github.com/cucumber/gherkin) for details. diff --git a/javascript/default.mk b/javascript/default.mk deleted file mode 100644 index b04d59c4a..000000000 --- a/javascript/default.mk +++ /dev/null @@ -1,87 +0,0 @@ -SHELL := /usr/bin/env bash -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) -TYPESCRIPT_SOURCE_FILES = $(sort $(call rwildcard,src test,*.ts *.tsx)) -PRIVATE = $(shell node -e "console.log(require('./package.json').private)") -IS_TESTDATA = $(findstring -testdata,${CURDIR}) -NPM_MODULE = $(shell cat package.json | jq .name --raw-output) - -default: .tested -.PHONY: default - -../../node_modules ../../package-lock.json: package.json - cd ../.. && npm install - -.codegen: - touch $@ - -.tested: .tested-npm .built - -.built: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - pushd ../.. && \ - npm run build && \ - popd && \ - touch $@ - -.tested-npm: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - npm run test - touch $@ - -pre-release: clean update-version update-dependencies default -.PHONY: pre-release - -update-dependencies: ../../node_modules ../../package-lock.json - ../../node_modules/.bin/npm-check-updates --upgrade --reject hast-util-sanitize,@types/node,react-markdown,rehype-raw,rehype-sanitize,remark-gfm -.PHONY: update-dependencies - -update-version: -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifdef NEW_VERSION - npm --no-git-tag-version --allow-same-version version "$(NEW_VERSION)" - # Update all npm packages that depend on us - pushd ../.. && \ - ./scripts/npm-each update_npm_dependency_if_exists package.json "$(NPM_MODULE)" "$(NEW_VERSION)" -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -endif -.PHONY: update-version - -publish: .codegen -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifneq (true,$(PRIVATE)) - npm publish --access public -else - @echo "Not publishing private npm module" -endif -endif -.PHONY: publish - -post-release: -.PHONY: post-release - -clean: clean-javascript -.PHONY: clean - -clean-javascript: - rm -rf .deps .codegen .tested* coverage dist acceptance -.PHONY: clean-javascript - -clobber: clean - rm -rf node_modules ../../node_modules -.PHONY: clobber - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/javascript/gherkin-javascript.razor b/javascript/gherkin-javascript.razor index cc6d94c25..aeda42869 100755 --- a/javascript/gherkin-javascript.razor +++ b/javascript/gherkin-javascript.razor @@ -53,6 +53,7 @@ export class Token implements IToken { public matchedKeyword: string public matchedIndent: number public matchedGherkinDialect: string + public matchedKeywordType: messages.StepKeywordType constructor( public readonly line: GherkinLine, diff --git a/javascript/gherkin.berp b/javascript/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/javascript/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/javascript/package-lock.json b/javascript/package-lock.json new file mode 100644 index 000000000..a18304fb0 --- /dev/null +++ b/javascript/package-lock.json @@ -0,0 +1,2112 @@ +{ + "name": "@cucumber/gherkin", + "version": "24.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@cucumber/gherkin", + "version": "24.1.0", + "license": "MIT", + "dependencies": { + "@cucumber/messages": "^19.1.4" + }, + "devDependencies": { + "@cucumber/gherkin-streams": "^5.0.1", + "@types/mocha": "10.0.0", + "@types/node": "18.11.9", + "core-js": "3.26.0", + "mocha": "10.1.0", + "ts-node": "10.9.1", + "typescript": "4.8.4" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cucumber/gherkin": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-24.1.0.tgz", + "integrity": "sha512-B48XrUod4y3SoXe6mv12q7U1zThUNSK3yHSm/hBJCJZ6RJUJhFk3FVMN/83qOEbsYZe6iG9v+4L1Myf8/q8C6g==", + "dev": true, + "peer": true, + "dependencies": { + "@cucumber/messages": "^19.1.4" + } + }, + "node_modules/@cucumber/gherkin-streams": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz", + "integrity": "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==", + "dev": true, + "dependencies": { + "commander": "9.1.0", + "source-map-support": "0.5.21" + }, + "bin": { + "gherkin-javascript": "bin/gherkin" + }, + "peerDependencies": { + "@cucumber/gherkin": ">=22.0.0", + "@cucumber/message-streams": ">=4.0.0", + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/message-streams": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz", + "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==", + "dev": true, + "peer": true, + "peerDependencies": { + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/messages": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-19.1.4.tgz", + "integrity": "sha512-Pksl0pnDz2l1+L5Ug85NlG6LWrrklN9qkMxN5Mv+1XZ3T6u580dnE6mVaxjJRdcOq4tR17Pc0RqIDZMyVY1FlA==", + "dependencies": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz", + "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", + "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@cucumber/gherkin": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-24.1.0.tgz", + "integrity": "sha512-B48XrUod4y3SoXe6mv12q7U1zThUNSK3yHSm/hBJCJZ6RJUJhFk3FVMN/83qOEbsYZe6iG9v+4L1Myf8/q8C6g==", + "dev": true, + "peer": true, + "requires": { + "@cucumber/messages": "^19.1.4" + } + }, + "@cucumber/gherkin-streams": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz", + "integrity": "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==", + "dev": true, + "requires": { + "commander": "9.1.0", + "source-map-support": "0.5.21" + } + }, + "@cucumber/message-streams": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz", + "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==", + "dev": true, + "peer": true, + "requires": {} + }, + "@cucumber/messages": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-19.1.4.tgz", + "integrity": "sha512-Pksl0pnDz2l1+L5Ug85NlG6LWrrklN9qkMxN5Mv+1XZ3T6u580dnE6mVaxjJRdcOq4tR17Pc0RqIDZMyVY1FlA==", + "requires": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", + "dev": true + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz", + "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "core-js": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", + "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mocha": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/javascript/package.json b/javascript/package.json index 7a387dfdd..908d36b63 100644 --- a/javascript/package.json +++ b/javascript/package.json @@ -5,12 +5,20 @@ "main": "dist/src/index.js", "types": "dist/src/index.d.ts", "scripts": { + "build:cjs": "tsc --build tsconfig.build-cjs.json", + "build:esm": "tsc --build tsconfig.build-esm.json", + "build:legacy": "tsc --build tsconfig.build.json", + "build": "npm run build:cjs && npm run build:esm && npm run build:legacy", + "clean": "npm run clean-tsc && rm -rf node_modules package-lock.json acceptance && rm -rf node_modules package-lock.json", + "clean-tsc": "rm -rf dist", "test": "mocha", + "eslint-fix": "eslint --ext ts,tsx --max-warnings 0 --fix", + "eslint": "eslint --ext ts,tsx --max-warnings 0", "prepublishOnly": "tsc --build tsconfig.build.json" }, "repository": { "type": "git", - "url": "git+https://github.com/cucumber/gherkin-javascript.git" + "url": "git+https://github.com/cucumber/gherkin.git" }, "keywords": [ "gherkin", @@ -19,9 +27,9 @@ "author": "Aslak Hellesøy", "license": "MIT", "bugs": { - "url": "https://github.com/cucumber/cucumber/issues" + "url": "https://github.com/cucumber/gherkin/issues" }, - "homepage": "https://github.com/cucumber/gherkin-javascript", + "homepage": "https://github.com/cucumber/gherkin", "devDependencies": { "@cucumber/gherkin-streams": "^5.0.1", "@types/mocha": "10.0.0", diff --git a/javascript/tsconfig.build-cjs.json b/javascript/tsconfig.build-cjs.json new file mode 100644 index 000000000..efbed36c5 --- /dev/null +++ b/javascript/tsconfig.build-cjs.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "target": "ES5", + "module": "CommonJS" + } +} diff --git a/javascript/tsconfig.build-esm.json b/javascript/tsconfig.build-esm.json new file mode 100644 index 000000000..424c829ad --- /dev/null +++ b/javascript/tsconfig.build-esm.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "lib": ["ES2019"], + "target": "ES6", + "module": "ES6" + } +} diff --git a/javascript/tsconfig.build.json b/javascript/tsconfig.build.json index c6df3b594..5412dbd5b 100644 --- a/javascript/tsconfig.build.json +++ b/javascript/tsconfig.build.json @@ -1,13 +1,18 @@ { - "extends": "../../tsconfig.build.json", + "extends": "./tsconfig.json", "compilerOptions": { + "composite": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, "rootDir": ".", - "outDir": "dist" + "noEmit": false }, + "files": [ + "src/gherkin-languages.json" + ], "include": [ - "package.json", - "src/gherkin-languages.json", "src", "test" ] -} +} \ No newline at end of file diff --git a/javascript/tsconfig.esm.json b/javascript/tsconfig.esm.json new file mode 100644 index 000000000..d5a9646ab --- /dev/null +++ b/javascript/tsconfig.esm.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "ts-node": { + "compilerOptions": { + "module": "esnext", + "lib": [ + "es6" + ], + "target": "ESNext", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true + } + } +} diff --git a/javascript/tsconfig.json b/javascript/tsconfig.json index 4082f16a5..f02fe891d 100644 --- a/javascript/tsconfig.json +++ b/javascript/tsconfig.json @@ -1,3 +1,23 @@ { - "extends": "../../tsconfig.json" + "compilerOptions": { + "declaration": true, + "target": "es2018", + "lib": [ + "es2019", + "dom" + ], + "sourceMap": true, + "allowJs": false, + "jsx": "react", + "resolveJsonModule": true, + "module": "commonjs", + "esModuleInterop": true, + "noImplicitAny": true, + "moduleResolution": "node", + "outDir": "dist", + "downlevelIteration": true, + "skipLibCheck": true, + "strictNullChecks": false, + "experimentalDecorators": true + } } diff --git a/objective-c/.github/ISSUE_TEMPLATE.md b/objective-c/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/objective-c/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/objective-c/.github/PULL_REQUEST_TEMPLATE.md b/objective-c/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/objective-c/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/objective-c/.rsync b/objective-c/.rsync deleted file mode 100644 index e87f6aa72..000000000 --- a/objective-c/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../LICENSE LICENSE -../../.templates/github/ .github/ -../../.templates/objective-c/ . -../gherkin.berp gherkin.berp -../gherkin-languages.json GherkinLanguages/gherkin-languages.json diff --git a/objective-c/.subrepo b/objective-c/.subrepo deleted file mode 100644 index fd1cd365c..000000000 --- a/objective-c/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-objective-c diff --git a/objective-c/LICENSE b/objective-c/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/objective-c/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/objective-c/Makefile b/objective-c/Makefile index 6789085e1..51c4dd9c3 100644 --- a/objective-c/Makefile +++ b/objective-c/Makefile @@ -1,4 +1,5 @@ -include default.mk +SHELL := /usr/bin/env bash +ALPINE := $(shell which apk 2> /dev/null) GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature") BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature") @@ -56,10 +57,14 @@ clobber: clean rm -rf Gherkin/GHParser.m Gherkin/GHParser.h .PHONY: clobber -Gherkin/GHParser.h: gherkin-objective-c-header.razor gherkin.berp +define berp-generate-parser = +berp -g ../gherkin.berp -t $< -o $@ --noBOM +endef + +Gherkin/GHParser.h: gherkin-objective-c-header.razor ../gherkin.berp $(berp-generate-parser) -Gherkin/GHParser.m: gherkin-objective-c-implementation.razor gherkin.berp +Gherkin/GHParser.m: gherkin-objective-c-implementation.razor ../gherkin.berp $(berp-generate-parser) build/AstGenerator: Gherkin/GHParser.h Gherkin/GHParser.m $(M_FILES) GherkinLanguages/gherkin-languages.json diff --git a/objective-c/default.mk b/objective-c/default.mk deleted file mode 100644 index 022eaa2be..000000000 --- a/objective-c/default.mk +++ /dev/null @@ -1,16 +0,0 @@ -# Please update /.templates/objective-c/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -ALPINE := $(shell which apk 2> /dev/null) - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/objective-c/gherkin.berp b/objective-c/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/objective-c/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/perl/.github/ISSUE_TEMPLATE.md b/perl/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/perl/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/perl/.github/PULL_REQUEST_TEMPLATE.md b/perl/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/perl/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/perl/.rsync b/perl/.rsync deleted file mode 100644 index 05465a916..000000000 --- a/perl/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../../.templates/github/ .github/ -../../.templates/perl/ . -../LICENSE LICENSE.txt -../gherkin.berp gherkin.berp -../gherkin-languages.json gherkin-languages.json diff --git a/perl/.subrepo b/perl/.subrepo deleted file mode 100644 index 878dccb59..000000000 --- a/perl/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-perl diff --git a/perl/Makefile b/perl/Makefile index da4866651..4a5a84498 100644 --- a/perl/Makefile +++ b/perl/Makefile @@ -1,62 +1,83 @@ -include default.mk +SHELL := /usr/bin/env bash -ifeq ($(CI),) -PERL5LIB = $$PWD/perl5/lib/perl5 -else -PERL5LIB = $$PWD/../../messages/perl/lib:$$PWD/perl5/lib/perl5 -endif -PERL5PATH = $$PWD/perl5/bin +GHERKIN_PARSER = lib/Gherkin/Generated/Parser.pm +GHERKIN_RAZOR = gherkin-perl.razor +SOURCE_FILES = $(shell find . -name "*.pm" | grep -v $(GHERKIN_PARSER)) + +GHERKIN = bin/gherkin +GHERKIN_GENERATE_TOKENS = bin/gherkin-generate-tokens GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature") BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature") -TOKENS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.tokens,$(GOOD_FEATURE_FILES)) -ASTS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.ast.ndjson,$(GOOD_FEATURE_FILES)) -PICKLES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.pickles.ndjson,$(GOOD_FEATURE_FILES)) -ERRORS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.errors.ndjson,$(BAD_FEATURE_FILES)) +TOKENS = $(patsubst ../testdata/%,acceptance/testdata/%.tokens,$(GOOD_FEATURE_FILES)) +ASTS = $(patsubst ../testdata/%,acceptance/testdata/%.ast.ndjson,$(GOOD_FEATURE_FILES)) +PICKLES = $(patsubst ../testdata/%,acceptance/testdata/%.pickles.ndjson,$(GOOD_FEATURE_FILES)) +SOURCES = $(patsubst ../testdata/%,acceptance/testdata/%.source.ndjson,$(GOOD_FEATURE_FILES)) +ERRORS = $(patsubst ../testdata/%,acceptance/testdata/%.errors.ndjson,$(BAD_FEATURE_FILES)) -.DELETE_ON_ERROR: +.DEFAULT_GOAL = help +PERL5LIB = $$PWD/perl5/lib/perl5 +GHERKIN = PERL5LIB=${PERL5LIB} bin/gherkin +GHERKIN_GENERATE_TOKENS = PERL5LIB=${PERL5LIB} bin/gherkin-generate-tokens + +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +generate: $(GHERKIN_PARSER) ## Generate gherkin parser files -default: .compared +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) + +copy-gherkin-languages: # lib/Gherkin/Generated/Languages.pm ## Copy gherkin-languages.json and/or generate derived files + echo "TODO: Depends on perl, this task should only depend on jq" + +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + # rm -f lib/Gherkin/Generated/Languages.pm + echo "TODO: Depends on perl, this task should only depend on jq" + +clean: ## Remove all build artifacts and files generated by the acceptance tests + rm -f .built + rm -rf acceptance + rm -rf perl5 + +.DELETE_ON_ERROR: -.deps: lib/Gherkin/Generated/Parser.pm lib/Gherkin/Generated/Languages.pm +acceptance: .built $(TOKENS) $(ASTS) $(PICKLES) $(SOURCES) #$(ERRORS) ## Build acceptance test dir and compare results with reference -.compared: $(TOKENS) $(ASTS) $(PICKLES) # $(ERRORS) +.built: perl5 $(SOURCE_FILES) touch $@ -acceptance/testdata/%.feature.tokens: ../testdata/%.feature ../testdata/%.feature.tokens .deps +perl5: + cpanm --notest --local-lib ./perl5 --installdeps --with-develop . + +lib/Gherkin/Generated/Languages.pm: + perl helper-scripts/build_languages.pl > $@ + +$(GHERKIN_PARSER): $(GHERKIN_RAZOR) ../gherkin.berp + berp -g ../gherkin.berp -t $< -o $@ --noBOM + +acceptance/testdata/%.tokens: ../testdata/% ../testdata/%.tokens mkdir -p $(@D) - PERL5LIB=${PERL5LIB} bin/gherkin-generate-tokens $< > $@ + $(GHERKIN_GENERATE_TOKENS) $< > $@ diff --unified $<.tokens $@ -acceptance/testdata/%.feature.ast.ndjson: ../testdata/%.feature ../testdata/%.feature.ast.ndjson .deps +acceptance/testdata/%.ast.ndjson: ../testdata/% ../testdata/%.ast.ndjson mkdir -p $(@D) - PERL5LIB=${PERL5LIB} bin/gherkin --predictable-ids --no-source --no-pickles $< > $@ + $(GHERKIN) --no-source --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.ast.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.pickles.ndjson: ../testdata/%.feature ../testdata/%.feature.pickles.ndjson .deps +acceptance/testdata/%.pickles.ndjson: ../testdata/% ../testdata/%.pickles.ndjson mkdir -p $(@D) - PERL5LIB=${PERL5LIB} bin/gherkin --predictable-ids --no-source --no-ast $< > $@ + $(GHERKIN) --no-source --no-ast --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.pickles.ndjson) <(jq "." $@) -#acceptance/testdata/%.feature.errors.ndjson: ../testdata/%.feature ../testdata/%.feature.errors.ndjson .deps +acceptance/testdata/%.source.ndjson: ../testdata/% ../testdata/%.source.ndjson + mkdir -p $(@D) + $(GHERKIN) --no-ast --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) + +#acceptance/testdata/%.errors.ndjson: ../testdata/% ../testdata/%.errors.ndjson # mkdir -p $(@D) -# PERL5LIB=${PERL5LIB} bin/gherkin --predictable-ids --no-pickles $< | jq --sort-keys --compact-output "." > $@ +# $(GHERKIN) --no-source --predictable-ids $< | jq --sort-keys --compact-output "." > $@ # diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) - -clean: - rm -rf .compared acceptance -.PHONY: clean - -clobber: clean - rm -rf lib/Gherkin/Generated -.PHONY: clobber - -lib/Gherkin/Generated: - mkdir -p $@ - -lib/Gherkin/Generated/Languages.pm: gherkin-languages.json .cpanfile_dependencies - PERL5LIB=./perl5/lib/perl5 perl helper-scripts/build_languages.pl < $< > $@ - -lib/Gherkin/Generated/Parser.pm: gherkin-perl.razor gherkin.berp - $(berp-generate-parser) diff --git a/perl/bin/gherkin b/perl/bin/gherkin index 25c74cd26..711963877 100755 --- a/perl/bin/gherkin +++ b/perl/bin/gherkin @@ -25,7 +25,7 @@ gherkin - Parser of documents in the Gherkin language C accepts a series of filenames to parse. It outputs a series of ndjson formatted messages containing the source document, parsed -document (AST) and pickles as specified at L. +document (AST) and pickles as specified at L. =head1 OPTIONS diff --git a/perl/default.mk b/perl/default.mk deleted file mode 100644 index dbd76fa37..000000000 --- a/perl/default.mk +++ /dev/null @@ -1,97 +0,0 @@ -# Please update /.templates/perl/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -PERL_SOURCE_FILES = $(shell find lib -name '*.pm') $(shell test -d bin && find bin -type f) $(shell find t -name '*.t') -LIBNAME := $(shell head -10 dist.ini | grep 'name.*=' | sed -e 's/name.*= *//') -DISTINI = $(shell find . -name 'dist.ini') -DIST := $(LIBNAME)-$(NEW_VERSION).tar.gz -IS_TESTDATA = $(findstring -testdata,${CURDIR}) - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef - - -### Common targets for all functionalities implemented on Perl - -default: .tested -.PHONY: default - -.deps: .cpanfile_dependencies - touch $@ - -.cpanfile_dependencies: cpanfile dist.ini - # --notest to keep the number of dependencies low: it doesn't install the - # testing dependencies of the dependencies. - cpanm --notest --local-lib ./perl5 --installdeps --with-develop . - cpanm --notest --local-lib ./perl5 'Dist::Zilla' - PERL5LIB=${PERL5LIB} PATH=$$PATH:${PERL5PATH} dzil authordeps --missing | cpanm --notest --local-lib ./perl5 - touch $@ - -.tested: .deps $(PERL_SOURCE_FILES) - PERL5LIB=${PERL5LIB} prove -l - touch $@ - -ifdef NEW_VERSION -ifneq (,$(DISTINI)) -dist: $(DIST) -else -dist: - @echo "Not building dist because there is no dist.ini" -endif -endif -.PHONY: dist - -$(DIST): .tested - @(git status --porcelain 2>/dev/null | grep "^??" | perl -ne\ - 'die "The `release` target includes all files in the working directory. Please remove [$$_], or add it to .gitignore if it should be included\n" if s!.+ perl/(.+?)\n!$$1!') - PERL5LIB=${PERL5LIB} PATH=$$PATH:${PERL5PATH} dzil build - PERL5LIB=${PERL5LIB} PATH=$$PATH:${PERL5PATH} cpanm --local-lib $(shell mktemp -d) --test-only $(DIST) - -pre-release: update-version CHANGELOG.md dist -.PHONY: pre-release - -update-version: -ifdef NEW_VERSION - echo $(NEW_VERSION) > VERSION -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-version - - -publish: dist -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifneq (,$(DISTINI)) - cpan-upload $(DIST) -endif -endif -.PHONY: publish - -post-release: -.PHONY: post-release - -perl-clean: - rm -rf ./perl5 .deps .cpanfile_dependencies .tested .build $(LIBNAME)-* -.PHONY: perl-clean - -clean: perl-clean -.PHONY: clean - -CHANGELOG.md: ../CHANGELOG.md - cp ../CHANGELOG.md CHANGELOG.md - - -dist-clean: clean -.PHONY: dist-clean diff --git a/perl/dist.ini b/perl/dist.ini index 7c0833345..82669a636 100644 --- a/perl/dist.ini +++ b/perl/dist.ini @@ -28,10 +28,7 @@ repository.type = git [Prereqs::FromCPANfile] [Git::GatherDir] exclude_match=^helper-scripts/ -exclude_filename=gherkin.berp exclude_filename=gherkin-perl.razor -exclude_filename=gherkin-languages.json -exclude_filename=default.mk exclude_filename=Makefile exclude_filename=VERSION diff --git a/perl/gherkin-languages.json b/perl/gherkin-languages.json deleted file mode 100644 index 279a4d89a..000000000 --- a/perl/gherkin-languages.json +++ /dev/null @@ -1,3741 +0,0 @@ -{ - "af": { - "and": [ - "* ", - "En " - ], - "background": [ - "Agtergrond" - ], - "but": [ - "* ", - "Maar " - ], - "examples": [ - "Voorbeelde" - ], - "feature": [ - "Funksie", - "Besigheid Behoefte", - "Vermoë" - ], - "given": [ - "* ", - "Gegewe " - ], - "name": "Afrikaans", - "native": "Afrikaans", - "rule": [ - "Regel" - ], - "scenario": [ - "Voorbeeld", - "Situasie" - ], - "scenarioOutline": [ - "Situasie Uiteensetting" - ], - "then": [ - "* ", - "Dan " - ], - "when": [ - "* ", - "Wanneer " - ] - }, - "am": { - "and": [ - "* ", - "Եվ " - ], - "background": [ - "Կոնտեքստ" - ], - "but": [ - "* ", - "Բայց " - ], - "examples": [ - "Օրինակներ" - ], - "feature": [ - "Ֆունկցիոնալություն", - "Հատկություն" - ], - "given": [ - "* ", - "Դիցուք " - ], - "name": "Armenian", - "native": "հայերեն", - "rule": [ - "Rule" - ], - "scenario": [ - "Օրինակ", - "Սցենար" - ], - "scenarioOutline": [ - "Սցենարի կառուցվացքը" - ], - "then": [ - "* ", - "Ապա " - ], - "when": [ - "* ", - "Եթե ", - "Երբ " - ] - }, - "an": { - "and": [ - "* ", - "Y ", - "E " - ], - "background": [ - "Antecedents" - ], - "but": [ - "* ", - "Pero " - ], - "examples": [ - "Eixemplos" - ], - "feature": [ - "Caracteristica" - ], - "given": [ - "* ", - "Dau ", - "Dada ", - "Daus ", - "Dadas " - ], - "name": "Aragonese", - "native": "Aragonés", - "rule": [ - "Rule" - ], - "scenario": [ - "Eixemplo", - "Caso" - ], - "scenarioOutline": [ - "Esquema del caso" - ], - "then": [ - "* ", - "Alavez ", - "Allora ", - "Antonces " - ], - "when": [ - "* ", - "Cuan " - ] - }, - "ar": { - "and": [ - "* ", - "و " - ], - "background": [ - "الخلفية" - ], - "but": [ - "* ", - "لكن " - ], - "examples": [ - "امثلة" - ], - "feature": [ - "خاصية" - ], - "given": [ - "* ", - "بفرض " - ], - "name": "Arabic", - "native": "العربية", - "rule": [ - "Rule" - ], - "scenario": [ - "مثال", - "سيناريو" - ], - "scenarioOutline": [ - "سيناريو مخطط" - ], - "then": [ - "* ", - "اذاً ", - "ثم " - ], - "when": [ - "* ", - "متى ", - "عندما " - ] - }, - "ast": { - "and": [ - "* ", - "Y ", - "Ya " - ], - "background": [ - "Antecedentes" - ], - "but": [ - "* ", - "Peru " - ], - "examples": [ - "Exemplos" - ], - "feature": [ - "Carauterística" - ], - "given": [ - "* ", - "Dáu ", - "Dada ", - "Daos ", - "Daes " - ], - "name": "Asturian", - "native": "asturianu", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemplo", - "Casu" - ], - "scenarioOutline": [ - "Esbozu del casu" - ], - "then": [ - "* ", - "Entós " - ], - "when": [ - "* ", - "Cuando " - ] - }, - "az": { - "and": [ - "* ", - "Və ", - "Həm " - ], - "background": [ - "Keçmiş", - "Kontekst" - ], - "but": [ - "* ", - "Amma ", - "Ancaq " - ], - "examples": [ - "Nümunələr" - ], - "feature": [ - "Özəllik" - ], - "given": [ - "* ", - "Tutaq ki ", - "Verilir " - ], - "name": "Azerbaijani", - "native": "Azərbaycanca", - "rule": [ - "Rule" - ], - "scenario": [ - "Nümunə", - "Ssenari" - ], - "scenarioOutline": [ - "Ssenarinin strukturu" - ], - "then": [ - "* ", - "O halda " - ], - "when": [ - "* ", - "Əgər ", - "Nə vaxt ki " - ] - }, - "bg": { - "and": [ - "* ", - "И " - ], - "background": [ - "Предистория" - ], - "but": [ - "* ", - "Но " - ], - "examples": [ - "Примери" - ], - "feature": [ - "Функционалност" - ], - "given": [ - "* ", - "Дадено " - ], - "name": "Bulgarian", - "native": "български", - "rule": [ - "Правило" - ], - "scenario": [ - "Пример", - "Сценарий" - ], - "scenarioOutline": [ - "Рамка на сценарий" - ], - "then": [ - "* ", - "То " - ], - "when": [ - "* ", - "Когато " - ] - }, - "bm": { - "and": [ - "* ", - "Dan " - ], - "background": [ - "Latar Belakang" - ], - "but": [ - "* ", - "Tetapi ", - "Tapi " - ], - "examples": [ - "Contoh" - ], - "feature": [ - "Fungsi" - ], - "given": [ - "* ", - "Diberi ", - "Bagi " - ], - "name": "Malay", - "native": "Bahasa Melayu", - "rule": [ - "Rule" - ], - "scenario": [ - "Senario", - "Situasi", - "Keadaan" - ], - "scenarioOutline": [ - "Kerangka Senario", - "Kerangka Situasi", - "Kerangka Keadaan", - "Garis Panduan Senario" - ], - "then": [ - "* ", - "Maka ", - "Kemudian " - ], - "when": [ - "* ", - "Apabila " - ] - }, - "bs": { - "and": [ - "* ", - "I ", - "A " - ], - "background": [ - "Pozadina" - ], - "but": [ - "* ", - "Ali " - ], - "examples": [ - "Primjeri" - ], - "feature": [ - "Karakteristika" - ], - "given": [ - "* ", - "Dato " - ], - "name": "Bosnian", - "native": "Bosanski", - "rule": [ - "Rule" - ], - "scenario": [ - "Primjer", - "Scenariju", - "Scenario" - ], - "scenarioOutline": [ - "Scenariju-obris", - "Scenario-outline" - ], - "then": [ - "* ", - "Zatim " - ], - "when": [ - "* ", - "Kada " - ] - }, - "ca": { - "and": [ - "* ", - "I " - ], - "background": [ - "Rerefons", - "Antecedents" - ], - "but": [ - "* ", - "Però " - ], - "examples": [ - "Exemples" - ], - "feature": [ - "Característica", - "Funcionalitat" - ], - "given": [ - "* ", - "Donat ", - "Donada ", - "Atès ", - "Atesa " - ], - "name": "Catalan", - "native": "català", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemple", - "Escenari" - ], - "scenarioOutline": [ - "Esquema de l'escenari" - ], - "then": [ - "* ", - "Aleshores ", - "Cal " - ], - "when": [ - "* ", - "Quan " - ] - }, - "cs": { - "and": [ - "* ", - "A také ", - "A " - ], - "background": [ - "Pozadí", - "Kontext" - ], - "but": [ - "* ", - "Ale " - ], - "examples": [ - "Příklady" - ], - "feature": [ - "Požadavek" - ], - "given": [ - "* ", - "Pokud ", - "Za předpokladu " - ], - "name": "Czech", - "native": "Česky", - "rule": [ - "Pravidlo" - ], - "scenario": [ - "Příklad", - "Scénář" - ], - "scenarioOutline": [ - "Náčrt Scénáře", - "Osnova scénáře" - ], - "then": [ - "* ", - "Pak " - ], - "when": [ - "* ", - "Když " - ] - }, - "cy-GB": { - "and": [ - "* ", - "A " - ], - "background": [ - "Cefndir" - ], - "but": [ - "* ", - "Ond " - ], - "examples": [ - "Enghreifftiau" - ], - "feature": [ - "Arwedd" - ], - "given": [ - "* ", - "Anrhegedig a " - ], - "name": "Welsh", - "native": "Cymraeg", - "rule": [ - "Rule" - ], - "scenario": [ - "Enghraifft", - "Scenario" - ], - "scenarioOutline": [ - "Scenario Amlinellol" - ], - "then": [ - "* ", - "Yna " - ], - "when": [ - "* ", - "Pryd " - ] - }, - "da": { - "and": [ - "* ", - "Og " - ], - "background": [ - "Baggrund" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Eksempler" - ], - "feature": [ - "Egenskab" - ], - "given": [ - "* ", - "Givet " - ], - "name": "Danish", - "native": "dansk", - "rule": [ - "Rule" - ], - "scenario": [ - "Eksempel", - "Scenarie" - ], - "scenarioOutline": [ - "Abstrakt Scenario" - ], - "then": [ - "* ", - "Så " - ], - "when": [ - "* ", - "Når " - ] - }, - "de": { - "and": [ - "* ", - "Und " - ], - "background": [ - "Grundlage", - "Hintergrund", - "Voraussetzungen", - "Vorbedingungen" - ], - "but": [ - "* ", - "Aber " - ], - "examples": [ - "Beispiele" - ], - "feature": [ - "Funktionalität", - "Funktion" - ], - "given": [ - "* ", - "Angenommen ", - "Gegeben sei ", - "Gegeben seien " - ], - "name": "German", - "native": "Deutsch", - "rule": [ - "Rule", - "Regel" - ], - "scenario": [ - "Beispiel", - "Szenario" - ], - "scenarioOutline": [ - "Szenariogrundriss", - "Szenarien" - ], - "then": [ - "* ", - "Dann " - ], - "when": [ - "* ", - "Wenn " - ] - }, - "el": { - "and": [ - "* ", - "Και " - ], - "background": [ - "Υπόβαθρο" - ], - "but": [ - "* ", - "Αλλά " - ], - "examples": [ - "Παραδείγματα", - "Σενάρια" - ], - "feature": [ - "Δυνατότητα", - "Λειτουργία" - ], - "given": [ - "* ", - "Δεδομένου " - ], - "name": "Greek", - "native": "Ελληνικά", - "rule": [ - "Rule" - ], - "scenario": [ - "Παράδειγμα", - "Σενάριο" - ], - "scenarioOutline": [ - "Περιγραφή Σεναρίου", - "Περίγραμμα Σεναρίου" - ], - "then": [ - "* ", - "Τότε " - ], - "when": [ - "* ", - "Όταν " - ] - }, - "em": { - "and": [ - "* ", - "😂" - ], - "background": [ - "💤" - ], - "but": [ - "* ", - "😔" - ], - "examples": [ - "📓" - ], - "feature": [ - "📚" - ], - "given": [ - "* ", - "😐" - ], - "name": "Emoji", - "native": "😀", - "rule": [ - "Rule" - ], - "scenario": [ - "🥒", - "📕" - ], - "scenarioOutline": [ - "📖" - ], - "then": [ - "* ", - "🙏" - ], - "when": [ - "* ", - "🎬" - ] - }, - "en": { - "and": [ - "* ", - "And " - ], - "background": [ - "Background" - ], - "but": [ - "* ", - "But " - ], - "examples": [ - "Examples", - "Scenarios" - ], - "feature": [ - "Feature", - "Business Need", - "Ability" - ], - "given": [ - "* ", - "Given " - ], - "name": "English", - "native": "English", - "rule": [ - "Rule" - ], - "scenario": [ - "Example", - "Scenario" - ], - "scenarioOutline": [ - "Scenario Outline", - "Scenario Template" - ], - "then": [ - "* ", - "Then " - ], - "when": [ - "* ", - "When " - ] - }, - "en-Scouse": { - "and": [ - "* ", - "An " - ], - "background": [ - "Dis is what went down" - ], - "but": [ - "* ", - "Buh " - ], - "examples": [ - "Examples" - ], - "feature": [ - "Feature" - ], - "given": [ - "* ", - "Givun ", - "Youse know when youse got " - ], - "name": "Scouse", - "native": "Scouse", - "rule": [ - "Rule" - ], - "scenario": [ - "The thing of it is" - ], - "scenarioOutline": [ - "Wharrimean is" - ], - "then": [ - "* ", - "Dun ", - "Den youse gotta " - ], - "when": [ - "* ", - "Wun ", - "Youse know like when " - ] - }, - "en-au": { - "and": [ - "* ", - "Too right " - ], - "background": [ - "First off" - ], - "but": [ - "* ", - "Yeah nah " - ], - "examples": [ - "You'll wanna" - ], - "feature": [ - "Pretty much" - ], - "given": [ - "* ", - "Y'know " - ], - "name": "Australian", - "native": "Australian", - "rule": [ - "Rule" - ], - "scenario": [ - "Awww, look mate" - ], - "scenarioOutline": [ - "Reckon it's like" - ], - "then": [ - "* ", - "But at the end of the day I reckon " - ], - "when": [ - "* ", - "It's just unbelievable " - ] - }, - "en-lol": { - "and": [ - "* ", - "AN " - ], - "background": [ - "B4" - ], - "but": [ - "* ", - "BUT " - ], - "examples": [ - "EXAMPLZ" - ], - "feature": [ - "OH HAI" - ], - "given": [ - "* ", - "I CAN HAZ " - ], - "name": "LOLCAT", - "native": "LOLCAT", - "rule": [ - "Rule" - ], - "scenario": [ - "MISHUN" - ], - "scenarioOutline": [ - "MISHUN SRSLY" - ], - "then": [ - "* ", - "DEN " - ], - "when": [ - "* ", - "WEN " - ] - }, - "en-old": { - "and": [ - "* ", - "Ond ", - "7 " - ], - "background": [ - "Aer", - "Ær" - ], - "but": [ - "* ", - "Ac " - ], - "examples": [ - "Se the", - "Se þe", - "Se ðe" - ], - "feature": [ - "Hwaet", - "Hwæt" - ], - "given": [ - "* ", - "Thurh ", - "Þurh ", - "Ðurh " - ], - "name": "Old English", - "native": "Englisc", - "rule": [ - "Rule" - ], - "scenario": [ - "Swa" - ], - "scenarioOutline": [ - "Swa hwaer swa", - "Swa hwær swa" - ], - "then": [ - "* ", - "Tha ", - "Þa ", - "Ða ", - "Tha the ", - "Þa þe ", - "Ða ðe " - ], - "when": [ - "* ", - "Bæþsealf ", - "Bæþsealfa ", - "Bæþsealfe ", - "Ciricæw ", - "Ciricæwe ", - "Ciricæwa " - ] - }, - "en-pirate": { - "and": [ - "* ", - "Aye " - ], - "background": [ - "Yo-ho-ho" - ], - "but": [ - "* ", - "Avast! " - ], - "examples": [ - "Dead men tell no tales" - ], - "feature": [ - "Ahoy matey!" - ], - "given": [ - "* ", - "Gangway! " - ], - "name": "Pirate", - "native": "Pirate", - "rule": [ - "Rule" - ], - "scenario": [ - "Heave to" - ], - "scenarioOutline": [ - "Shiver me timbers" - ], - "then": [ - "* ", - "Let go and haul " - ], - "when": [ - "* ", - "Blimey! " - ] - }, - "en-tx": { - "and": [ - "Come hell or high water " - ], - "background": [ - "Lemme tell y'all a story" - ], - "but": [ - "Well now hold on, I'll you what " - ], - "examples": [ - "Now that's a story longer than a cattle drive in July" - ], - "feature": [ - "This ain’t my first rodeo", - "All gussied up" - ], - "given": [ - "Fixin' to ", - "All git out " - ], - "name": "Texas", - "native": "Texas", - "rule": [ - "Rule " - ], - "scenario": [ - "All hat and no cattle" - ], - "scenarioOutline": [ - "Serious as a snake bite", - "Busy as a hound in flea season" - ], - "then": [ - "There’s no tree but bears some fruit " - ], - "when": [ - "Quick out of the chute " - ] - }, - "eo": { - "and": [ - "* ", - "Kaj " - ], - "background": [ - "Fono" - ], - "but": [ - "* ", - "Sed " - ], - "examples": [ - "Ekzemploj" - ], - "feature": [ - "Trajto" - ], - "given": [ - "* ", - "Donitaĵo ", - "Komence " - ], - "name": "Esperanto", - "native": "Esperanto", - "rule": [ - "Rule" - ], - "scenario": [ - "Ekzemplo", - "Scenaro", - "Kazo" - ], - "scenarioOutline": [ - "Konturo de la scenaro", - "Skizo", - "Kazo-skizo" - ], - "then": [ - "* ", - "Do " - ], - "when": [ - "* ", - "Se " - ] - }, - "es": { - "and": [ - "* ", - "Y ", - "E " - ], - "background": [ - "Antecedentes" - ], - "but": [ - "* ", - "Pero " - ], - "examples": [ - "Ejemplos" - ], - "feature": [ - "Característica", - "Necesidad del negocio", - "Requisito" - ], - "given": [ - "* ", - "Dado ", - "Dada ", - "Dados ", - "Dadas " - ], - "name": "Spanish", - "native": "español", - "rule": [ - "Regla", - "Regla de negocio" - ], - "scenario": [ - "Ejemplo", - "Escenario" - ], - "scenarioOutline": [ - "Esquema del escenario" - ], - "then": [ - "* ", - "Entonces " - ], - "when": [ - "* ", - "Cuando " - ] - }, - "et": { - "and": [ - "* ", - "Ja " - ], - "background": [ - "Taust" - ], - "but": [ - "* ", - "Kuid " - ], - "examples": [ - "Juhtumid" - ], - "feature": [ - "Omadus" - ], - "given": [ - "* ", - "Eeldades " - ], - "name": "Estonian", - "native": "eesti keel", - "rule": [ - "Reegel" - ], - "scenario": [ - "Juhtum", - "Stsenaarium" - ], - "scenarioOutline": [ - "Raamjuhtum", - "Raamstsenaarium" - ], - "then": [ - "* ", - "Siis " - ], - "when": [ - "* ", - "Kui " - ] - }, - "fa": { - "and": [ - "* ", - "و " - ], - "background": [ - "زمینه" - ], - "but": [ - "* ", - "اما " - ], - "examples": [ - "نمونه ها" - ], - "feature": [ - "وِیژگی" - ], - "given": [ - "* ", - "با فرض " - ], - "name": "Persian", - "native": "فارسی", - "rule": [ - "Rule" - ], - "scenario": [ - "مثال", - "سناریو" - ], - "scenarioOutline": [ - "الگوی سناریو" - ], - "then": [ - "* ", - "آنگاه " - ], - "when": [ - "* ", - "هنگامی " - ] - }, - "fi": { - "and": [ - "* ", - "Ja " - ], - "background": [ - "Tausta" - ], - "but": [ - "* ", - "Mutta " - ], - "examples": [ - "Tapaukset" - ], - "feature": [ - "Ominaisuus" - ], - "given": [ - "* ", - "Oletetaan " - ], - "name": "Finnish", - "native": "suomi", - "rule": [ - "Rule" - ], - "scenario": [ - "Tapaus" - ], - "scenarioOutline": [ - "Tapausaihio" - ], - "then": [ - "* ", - "Niin " - ], - "when": [ - "* ", - "Kun " - ] - }, - "fr": { - "and": [ - "* ", - "Et que ", - "Et qu'", - "Et " - ], - "background": [ - "Contexte" - ], - "but": [ - "* ", - "Mais que ", - "Mais qu'", - "Mais " - ], - "examples": [ - "Exemples" - ], - "feature": [ - "Fonctionnalité" - ], - "given": [ - "* ", - "Soit ", - "Sachant que ", - "Sachant qu'", - "Sachant ", - "Etant donné que ", - "Etant donné qu'", - "Etant donné ", - "Etant donnée ", - "Etant donnés ", - "Etant données ", - "Étant donné que ", - "Étant donné qu'", - "Étant donné ", - "Étant donnée ", - "Étant donnés ", - "Étant données " - ], - "name": "French", - "native": "français", - "rule": [ - "Règle" - ], - "scenario": [ - "Exemple", - "Scénario" - ], - "scenarioOutline": [ - "Plan du scénario", - "Plan du Scénario" - ], - "then": [ - "* ", - "Alors ", - "Donc " - ], - "when": [ - "* ", - "Quand ", - "Lorsque ", - "Lorsqu'" - ] - }, - "ga": { - "and": [ - "* ", - "Agus" - ], - "background": [ - "Cúlra" - ], - "but": [ - "* ", - "Ach" - ], - "examples": [ - "Samplaí" - ], - "feature": [ - "Gné" - ], - "given": [ - "* ", - "Cuir i gcás go", - "Cuir i gcás nach", - "Cuir i gcás gur", - "Cuir i gcás nár" - ], - "name": "Irish", - "native": "Gaeilge", - "rule": [ - "Rule" - ], - "scenario": [ - "Sampla", - "Cás" - ], - "scenarioOutline": [ - "Cás Achomair" - ], - "then": [ - "* ", - "Ansin" - ], - "when": [ - "* ", - "Nuair a", - "Nuair nach", - "Nuair ba", - "Nuair nár" - ] - }, - "gj": { - "and": [ - "* ", - "અને " - ], - "background": [ - "બેકગ્રાઉન્ડ" - ], - "but": [ - "* ", - "પણ " - ], - "examples": [ - "ઉદાહરણો" - ], - "feature": [ - "લક્ષણ", - "વ્યાપાર જરૂર", - "ક્ષમતા" - ], - "given": [ - "* ", - "આપેલ છે " - ], - "name": "Gujarati", - "native": "ગુજરાતી", - "rule": [ - "Rule" - ], - "scenario": [ - "ઉદાહરણ", - "સ્થિતિ" - ], - "scenarioOutline": [ - "પરિદ્દશ્ય રૂપરેખા", - "પરિદ્દશ્ય ઢાંચો" - ], - "then": [ - "* ", - "પછી " - ], - "when": [ - "* ", - "ક્યારે " - ] - }, - "gl": { - "and": [ - "* ", - "E " - ], - "background": [ - "Contexto" - ], - "but": [ - "* ", - "Mais ", - "Pero " - ], - "examples": [ - "Exemplos" - ], - "feature": [ - "Característica" - ], - "given": [ - "* ", - "Dado ", - "Dada ", - "Dados ", - "Dadas " - ], - "name": "Galician", - "native": "galego", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemplo", - "Escenario" - ], - "scenarioOutline": [ - "Esbozo do escenario" - ], - "then": [ - "* ", - "Entón ", - "Logo " - ], - "when": [ - "* ", - "Cando " - ] - }, - "he": { - "and": [ - "* ", - "וגם " - ], - "background": [ - "רקע" - ], - "but": [ - "* ", - "אבל " - ], - "examples": [ - "דוגמאות" - ], - "feature": [ - "תכונה" - ], - "given": [ - "* ", - "בהינתן " - ], - "name": "Hebrew", - "native": "עברית", - "rule": [ - "כלל" - ], - "scenario": [ - "דוגמא", - "תרחיש" - ], - "scenarioOutline": [ - "תבנית תרחיש" - ], - "then": [ - "* ", - "אז ", - "אזי " - ], - "when": [ - "* ", - "כאשר " - ] - }, - "hi": { - "and": [ - "* ", - "और ", - "तथा " - ], - "background": [ - "पृष्ठभूमि" - ], - "but": [ - "* ", - "पर ", - "परन्तु ", - "किन्तु " - ], - "examples": [ - "उदाहरण" - ], - "feature": [ - "रूप लेख" - ], - "given": [ - "* ", - "अगर ", - "यदि ", - "चूंकि " - ], - "name": "Hindi", - "native": "हिंदी", - "rule": [ - "नियम" - ], - "scenario": [ - "परिदृश्य" - ], - "scenarioOutline": [ - "परिदृश्य रूपरेखा" - ], - "then": [ - "* ", - "तब ", - "तदा " - ], - "when": [ - "* ", - "जब ", - "कदा " - ] - }, - "hr": { - "and": [ - "* ", - "I " - ], - "background": [ - "Pozadina" - ], - "but": [ - "* ", - "Ali " - ], - "examples": [ - "Primjeri", - "Scenariji" - ], - "feature": [ - "Osobina", - "Mogućnost", - "Mogucnost" - ], - "given": [ - "* ", - "Zadan ", - "Zadani ", - "Zadano ", - "Ukoliko " - ], - "name": "Croatian", - "native": "hrvatski", - "rule": [ - "Rule" - ], - "scenario": [ - "Primjer", - "Scenarij" - ], - "scenarioOutline": [ - "Skica", - "Koncept" - ], - "then": [ - "* ", - "Onda " - ], - "when": [ - "* ", - "Kada ", - "Kad " - ] - }, - "ht": { - "and": [ - "* ", - "Ak ", - "Epi ", - "E " - ], - "background": [ - "Kontèks", - "Istorik" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Egzanp" - ], - "feature": [ - "Karakteristik", - "Mak", - "Fonksyonalite" - ], - "given": [ - "* ", - "Sipoze ", - "Sipoze ke ", - "Sipoze Ke " - ], - "name": "Creole", - "native": "kreyòl", - "rule": [ - "Rule" - ], - "scenario": [ - "Senaryo" - ], - "scenarioOutline": [ - "Plan senaryo", - "Plan Senaryo", - "Senaryo deskripsyon", - "Senaryo Deskripsyon", - "Dyagram senaryo", - "Dyagram Senaryo" - ], - "then": [ - "* ", - "Lè sa a ", - "Le sa a " - ], - "when": [ - "* ", - "Lè ", - "Le " - ] - }, - "hu": { - "and": [ - "* ", - "És " - ], - "background": [ - "Háttér" - ], - "but": [ - "* ", - "De " - ], - "examples": [ - "Példák" - ], - "feature": [ - "Jellemző" - ], - "given": [ - "* ", - "Amennyiben ", - "Adott " - ], - "name": "Hungarian", - "native": "magyar", - "rule": [ - "Szabály" - ], - "scenario": [ - "Példa", - "Forgatókönyv" - ], - "scenarioOutline": [ - "Forgatókönyv vázlat" - ], - "then": [ - "* ", - "Akkor " - ], - "when": [ - "* ", - "Majd ", - "Ha ", - "Amikor " - ] - }, - "id": { - "and": [ - "* ", - "Dan " - ], - "background": [ - "Dasar", - "Latar Belakang" - ], - "but": [ - "* ", - "Tapi ", - "Tetapi " - ], - "examples": [ - "Contoh", - "Misal" - ], - "feature": [ - "Fitur" - ], - "given": [ - "* ", - "Dengan ", - "Diketahui ", - "Diasumsikan ", - "Bila ", - "Jika " - ], - "name": "Indonesian", - "native": "Bahasa Indonesia", - "rule": [ - "Rule", - "Aturan" - ], - "scenario": [ - "Skenario" - ], - "scenarioOutline": [ - "Skenario konsep", - "Garis-Besar Skenario" - ], - "then": [ - "* ", - "Maka ", - "Kemudian " - ], - "when": [ - "* ", - "Ketika " - ] - }, - "is": { - "and": [ - "* ", - "Og " - ], - "background": [ - "Bakgrunnur" - ], - "but": [ - "* ", - "En " - ], - "examples": [ - "Dæmi", - "Atburðarásir" - ], - "feature": [ - "Eiginleiki" - ], - "given": [ - "* ", - "Ef " - ], - "name": "Icelandic", - "native": "Íslenska", - "rule": [ - "Rule" - ], - "scenario": [ - "Atburðarás" - ], - "scenarioOutline": [ - "Lýsing Atburðarásar", - "Lýsing Dæma" - ], - "then": [ - "* ", - "Þá " - ], - "when": [ - "* ", - "Þegar " - ] - }, - "it": { - "and": [ - "* ", - "E " - ], - "background": [ - "Contesto" - ], - "but": [ - "* ", - "Ma " - ], - "examples": [ - "Esempi" - ], - "feature": [ - "Funzionalità", - "Esigenza di Business", - "Abilità" - ], - "given": [ - "* ", - "Dato ", - "Data ", - "Dati ", - "Date " - ], - "name": "Italian", - "native": "italiano", - "rule": [ - "Regola" - ], - "scenario": [ - "Esempio", - "Scenario" - ], - "scenarioOutline": [ - "Schema dello scenario" - ], - "then": [ - "* ", - "Allora " - ], - "when": [ - "* ", - "Quando " - ] - }, - "ja": { - "and": [ - "* ", - "且つ", - "かつ" - ], - "background": [ - "背景" - ], - "but": [ - "* ", - "然し", - "しかし", - "但し", - "ただし" - ], - "examples": [ - "例", - "サンプル" - ], - "feature": [ - "フィーチャ", - "機能" - ], - "given": [ - "* ", - "前提" - ], - "name": "Japanese", - "native": "日本語", - "rule": [ - "ルール" - ], - "scenario": [ - "シナリオ" - ], - "scenarioOutline": [ - "シナリオアウトライン", - "シナリオテンプレート", - "テンプレ", - "シナリオテンプレ" - ], - "then": [ - "* ", - "ならば" - ], - "when": [ - "* ", - "もし" - ] - }, - "jv": { - "and": [ - "* ", - "Lan " - ], - "background": [ - "Dasar" - ], - "but": [ - "* ", - "Tapi ", - "Nanging ", - "Ananging " - ], - "examples": [ - "Conto", - "Contone" - ], - "feature": [ - "Fitur" - ], - "given": [ - "* ", - "Nalika ", - "Nalikaning " - ], - "name": "Javanese", - "native": "Basa Jawa", - "rule": [ - "Rule" - ], - "scenario": [ - "Skenario" - ], - "scenarioOutline": [ - "Konsep skenario" - ], - "then": [ - "* ", - "Njuk ", - "Banjur " - ], - "when": [ - "* ", - "Manawa ", - "Menawa " - ] - }, - "ka": { - "and": [ - "* ", - "და ", - "ასევე " - ], - "background": [ - "კონტექსტი" - ], - "but": [ - "* ", - "მაგრამ ", - "თუმცა " - ], - "examples": [ - "მაგალითები" - ], - "feature": [ - "თვისება", - "მოთხოვნა" - ], - "given": [ - "* ", - "მოცემული ", - "Მოცემულია ", - "ვთქვათ " - ], - "name": "Georgian", - "native": "ქართული", - "rule": [ - "წესი" - ], - "scenario": [ - "მაგალითად", - "მაგალითი", - "მაგ", - "სცენარი" - ], - "scenarioOutline": [ - "სცენარის ნიმუში", - "სცენარის შაბლონი", - "ნიმუში", - "შაბლონი" - ], - "then": [ - "* ", - "მაშინ " - ], - "when": [ - "* ", - "როდესაც ", - "როცა ", - "როგორც კი ", - "თუ " - ] - }, - "kn": { - "and": [ - "* ", - "ಮತ್ತು " - ], - "background": [ - "ಹಿನ್ನೆಲೆ" - ], - "but": [ - "* ", - "ಆದರೆ " - ], - "examples": [ - "ಉದಾಹರಣೆಗಳು" - ], - "feature": [ - "ಹೆಚ್ಚಳ" - ], - "given": [ - "* ", - "ನೀಡಿದ " - ], - "name": "Kannada", - "native": "ಕನ್ನಡ", - "rule": [ - "Rule" - ], - "scenario": [ - "ಉದಾಹರಣೆ", - "ಕಥಾಸಾರಾಂಶ" - ], - "scenarioOutline": [ - "ವಿವರಣೆ" - ], - "then": [ - "* ", - "ನಂತರ " - ], - "when": [ - "* ", - "ಸ್ಥಿತಿಯನ್ನು " - ] - }, - "ko": { - "and": [ - "* ", - "그리고" - ], - "background": [ - "배경" - ], - "but": [ - "* ", - "하지만", - "단" - ], - "examples": [ - "예" - ], - "feature": [ - "기능" - ], - "given": [ - "* ", - "조건", - "먼저" - ], - "name": "Korean", - "native": "한국어", - "rule": [ - "Rule" - ], - "scenario": [ - "시나리오" - ], - "scenarioOutline": [ - "시나리오 개요" - ], - "then": [ - "* ", - "그러면" - ], - "when": [ - "* ", - "만일", - "만약" - ] - }, - "lt": { - "and": [ - "* ", - "Ir " - ], - "background": [ - "Kontekstas" - ], - "but": [ - "* ", - "Bet " - ], - "examples": [ - "Pavyzdžiai", - "Scenarijai", - "Variantai" - ], - "feature": [ - "Savybė" - ], - "given": [ - "* ", - "Duota " - ], - "name": "Lithuanian", - "native": "lietuvių kalba", - "rule": [ - "Rule" - ], - "scenario": [ - "Pavyzdys", - "Scenarijus" - ], - "scenarioOutline": [ - "Scenarijaus šablonas" - ], - "then": [ - "* ", - "Tada " - ], - "when": [ - "* ", - "Kai " - ] - }, - "lu": { - "and": [ - "* ", - "an ", - "a " - ], - "background": [ - "Hannergrond" - ], - "but": [ - "* ", - "awer ", - "mä " - ], - "examples": [ - "Beispiller" - ], - "feature": [ - "Funktionalitéit" - ], - "given": [ - "* ", - "ugeholl " - ], - "name": "Luxemburgish", - "native": "Lëtzebuergesch", - "rule": [ - "Rule" - ], - "scenario": [ - "Beispill", - "Szenario" - ], - "scenarioOutline": [ - "Plang vum Szenario" - ], - "then": [ - "* ", - "dann " - ], - "when": [ - "* ", - "wann " - ] - }, - "lv": { - "and": [ - "* ", - "Un " - ], - "background": [ - "Konteksts", - "Situācija" - ], - "but": [ - "* ", - "Bet " - ], - "examples": [ - "Piemēri", - "Paraugs" - ], - "feature": [ - "Funkcionalitāte", - "Fīča" - ], - "given": [ - "* ", - "Kad " - ], - "name": "Latvian", - "native": "latviešu", - "rule": [ - "Rule" - ], - "scenario": [ - "Piemērs", - "Scenārijs" - ], - "scenarioOutline": [ - "Scenārijs pēc parauga" - ], - "then": [ - "* ", - "Tad " - ], - "when": [ - "* ", - "Ja " - ] - }, - "mk-Cyrl": { - "and": [ - "* ", - "И " - ], - "background": [ - "Контекст", - "Содржина" - ], - "but": [ - "* ", - "Но " - ], - "examples": [ - "Примери", - "Сценарија" - ], - "feature": [ - "Функционалност", - "Бизнис потреба", - "Можност" - ], - "given": [ - "* ", - "Дадено ", - "Дадена " - ], - "name": "Macedonian", - "native": "Македонски", - "rule": [ - "Rule" - ], - "scenario": [ - "Пример", - "Сценарио", - "На пример" - ], - "scenarioOutline": [ - "Преглед на сценарија", - "Скица", - "Концепт" - ], - "then": [ - "* ", - "Тогаш " - ], - "when": [ - "* ", - "Кога " - ] - }, - "mk-Latn": { - "and": [ - "* ", - "I " - ], - "background": [ - "Kontekst", - "Sodrzhina" - ], - "but": [ - "* ", - "No " - ], - "examples": [ - "Primeri", - "Scenaria" - ], - "feature": [ - "Funkcionalnost", - "Biznis potreba", - "Mozhnost" - ], - "given": [ - "* ", - "Dadeno ", - "Dadena " - ], - "name": "Macedonian (Latin)", - "native": "Makedonski (Latinica)", - "rule": [ - "Rule" - ], - "scenario": [ - "Scenario", - "Na primer" - ], - "scenarioOutline": [ - "Pregled na scenarija", - "Skica", - "Koncept" - ], - "then": [ - "* ", - "Togash " - ], - "when": [ - "* ", - "Koga " - ] - }, - "mn": { - "and": [ - "* ", - "Мөн ", - "Тэгээд " - ], - "background": [ - "Агуулга" - ], - "but": [ - "* ", - "Гэхдээ ", - "Харин " - ], - "examples": [ - "Тухайлбал" - ], - "feature": [ - "Функц", - "Функционал" - ], - "given": [ - "* ", - "Өгөгдсөн нь ", - "Анх " - ], - "name": "Mongolian", - "native": "монгол", - "rule": [ - "Rule" - ], - "scenario": [ - "Сценар" - ], - "scenarioOutline": [ - "Сценарын төлөвлөгөө" - ], - "then": [ - "* ", - "Тэгэхэд ", - "Үүний дараа " - ], - "when": [ - "* ", - "Хэрэв " - ] - }, - "ne": { - "and": [ - "* ", - "र ", - "अनि " - ], - "background": [ - "पृष्ठभूमी" - ], - "but": [ - "* ", - "तर " - ], - "examples": [ - "उदाहरण", - "उदाहरणहरु" - ], - "feature": [ - "सुविधा", - "विशेषता" - ], - "given": [ - "* ", - "दिइएको ", - "दिएको ", - "यदि " - ], - "name": "Nepali", - "native": "नेपाली", - "rule": [ - "नियम" - ], - "scenario": [ - "परिदृश्य" - ], - "scenarioOutline": [ - "परिदृश्य रूपरेखा" - ], - "then": [ - "* ", - "त्यसपछि ", - "अनी " - ], - "when": [ - "* ", - "जब " - ] - }, - "nl": { - "and": [ - "* ", - "En " - ], - "background": [ - "Achtergrond" - ], - "but": [ - "* ", - "Maar " - ], - "examples": [ - "Voorbeelden" - ], - "feature": [ - "Functionaliteit" - ], - "given": [ - "* ", - "Gegeven ", - "Stel " - ], - "name": "Dutch", - "native": "Nederlands", - "rule": [ - "Rule" - ], - "scenario": [ - "Voorbeeld", - "Scenario" - ], - "scenarioOutline": [ - "Abstract Scenario" - ], - "then": [ - "* ", - "Dan " - ], - "when": [ - "* ", - "Als ", - "Wanneer " - ] - }, - "no": { - "and": [ - "* ", - "Og " - ], - "background": [ - "Bakgrunn" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Eksempler" - ], - "feature": [ - "Egenskap" - ], - "given": [ - "* ", - "Gitt " - ], - "name": "Norwegian", - "native": "norsk", - "rule": [ - "Regel" - ], - "scenario": [ - "Eksempel", - "Scenario" - ], - "scenarioOutline": [ - "Scenariomal", - "Abstrakt Scenario" - ], - "then": [ - "* ", - "Så " - ], - "when": [ - "* ", - "Når " - ] - }, - "pa": { - "and": [ - "* ", - "ਅਤੇ " - ], - "background": [ - "ਪਿਛੋਕੜ" - ], - "but": [ - "* ", - "ਪਰ " - ], - "examples": [ - "ਉਦਾਹਰਨਾਂ" - ], - "feature": [ - "ਖਾਸੀਅਤ", - "ਮੁਹਾਂਦਰਾ", - "ਨਕਸ਼ ਨੁਹਾਰ" - ], - "given": [ - "* ", - "ਜੇਕਰ ", - "ਜਿਵੇਂ ਕਿ " - ], - "name": "Panjabi", - "native": "ਪੰਜਾਬੀ", - "rule": [ - "Rule" - ], - "scenario": [ - "ਉਦਾਹਰਨ", - "ਪਟਕਥਾ" - ], - "scenarioOutline": [ - "ਪਟਕਥਾ ਢਾਂਚਾ", - "ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ" - ], - "then": [ - "* ", - "ਤਦ " - ], - "when": [ - "* ", - "ਜਦੋਂ " - ] - }, - "pl": { - "and": [ - "* ", - "Oraz ", - "I " - ], - "background": [ - "Założenia" - ], - "but": [ - "* ", - "Ale " - ], - "examples": [ - "Przykłady" - ], - "feature": [ - "Właściwość", - "Funkcja", - "Aspekt", - "Potrzeba biznesowa" - ], - "given": [ - "* ", - "Zakładając ", - "Mając ", - "Zakładając, że " - ], - "name": "Polish", - "native": "polski", - "rule": [ - "Zasada", - "Reguła" - ], - "scenario": [ - "Przykład", - "Scenariusz" - ], - "scenarioOutline": [ - "Szablon scenariusza" - ], - "then": [ - "* ", - "Wtedy " - ], - "when": [ - "* ", - "Jeżeli ", - "Jeśli ", - "Gdy ", - "Kiedy " - ] - }, - "pt": { - "and": [ - "* ", - "E " - ], - "background": [ - "Contexto", - "Cenário de Fundo", - "Cenario de Fundo", - "Fundo" - ], - "but": [ - "* ", - "Mas " - ], - "examples": [ - "Exemplos", - "Cenários", - "Cenarios" - ], - "feature": [ - "Funcionalidade", - "Característica", - "Caracteristica" - ], - "given": [ - "* ", - "Dado ", - "Dada ", - "Dados ", - "Dadas " - ], - "name": "Portuguese", - "native": "português", - "rule": [ - "Regra" - ], - "scenario": [ - "Exemplo", - "Cenário", - "Cenario" - ], - "scenarioOutline": [ - "Esquema do Cenário", - "Esquema do Cenario", - "Delineação do Cenário", - "Delineacao do Cenario" - ], - "then": [ - "* ", - "Então ", - "Entao " - ], - "when": [ - "* ", - "Quando " - ] - }, - "ro": { - "and": [ - "* ", - "Si ", - "Și ", - "Şi " - ], - "background": [ - "Context" - ], - "but": [ - "* ", - "Dar " - ], - "examples": [ - "Exemple" - ], - "feature": [ - "Functionalitate", - "Funcționalitate", - "Funcţionalitate" - ], - "given": [ - "* ", - "Date fiind ", - "Dat fiind ", - "Dată fiind", - "Dati fiind ", - "Dați fiind ", - "Daţi fiind " - ], - "name": "Romanian", - "native": "română", - "rule": [ - "Rule" - ], - "scenario": [ - "Exemplu", - "Scenariu" - ], - "scenarioOutline": [ - "Structura scenariu", - "Structură scenariu" - ], - "then": [ - "* ", - "Atunci " - ], - "when": [ - "* ", - "Cand ", - "Când " - ] - }, - "ru": { - "and": [ - "* ", - "И ", - "К тому же ", - "Также " - ], - "background": [ - "Предыстория", - "Контекст" - ], - "but": [ - "* ", - "Но ", - "А ", - "Иначе " - ], - "examples": [ - "Примеры" - ], - "feature": [ - "Функция", - "Функциональность", - "Функционал", - "Свойство", - "Фича" - ], - "given": [ - "* ", - "Допустим ", - "Дано ", - "Пусть " - ], - "name": "Russian", - "native": "русский", - "rule": [ - "Правило" - ], - "scenario": [ - "Пример", - "Сценарий" - ], - "scenarioOutline": [ - "Структура сценария", - "Шаблон сценария" - ], - "then": [ - "* ", - "То ", - "Затем ", - "Тогда " - ], - "when": [ - "* ", - "Когда ", - "Если " - ] - }, - "sk": { - "and": [ - "* ", - "A ", - "A tiež ", - "A taktiež ", - "A zároveň " - ], - "background": [ - "Pozadie" - ], - "but": [ - "* ", - "Ale " - ], - "examples": [ - "Príklady" - ], - "feature": [ - "Požiadavka", - "Funkcia", - "Vlastnosť" - ], - "given": [ - "* ", - "Pokiaľ ", - "Za predpokladu " - ], - "name": "Slovak", - "native": "Slovensky", - "rule": [ - "Rule" - ], - "scenario": [ - "Príklad", - "Scenár" - ], - "scenarioOutline": [ - "Náčrt Scenáru", - "Náčrt Scenára", - "Osnova Scenára" - ], - "then": [ - "* ", - "Tak ", - "Potom " - ], - "when": [ - "* ", - "Keď ", - "Ak " - ] - }, - "sl": { - "and": [ - "In ", - "Ter " - ], - "background": [ - "Kontekst", - "Osnova", - "Ozadje" - ], - "but": [ - "Toda ", - "Ampak ", - "Vendar " - ], - "examples": [ - "Primeri", - "Scenariji" - ], - "feature": [ - "Funkcionalnost", - "Funkcija", - "Možnosti", - "Moznosti", - "Lastnost", - "Značilnost" - ], - "given": [ - "Dano ", - "Podano ", - "Zaradi ", - "Privzeto " - ], - "name": "Slovenian", - "native": "Slovenski", - "rule": [ - "Rule" - ], - "scenario": [ - "Primer", - "Scenarij" - ], - "scenarioOutline": [ - "Struktura scenarija", - "Skica", - "Koncept", - "Oris scenarija", - "Osnutek" - ], - "then": [ - "Nato ", - "Potem ", - "Takrat " - ], - "when": [ - "Ko ", - "Ce ", - "Če ", - "Kadar " - ] - }, - "sr-Cyrl": { - "and": [ - "* ", - "И " - ], - "background": [ - "Контекст", - "Основа", - "Позадина" - ], - "but": [ - "* ", - "Али " - ], - "examples": [ - "Примери", - "Сценарији" - ], - "feature": [ - "Функционалност", - "Могућност", - "Особина" - ], - "given": [ - "* ", - "За дато ", - "За дате ", - "За дати " - ], - "name": "Serbian", - "native": "Српски", - "rule": [ - "Правило" - ], - "scenario": [ - "Пример", - "Сценарио", - "Пример" - ], - "scenarioOutline": [ - "Структура сценарија", - "Скица", - "Концепт" - ], - "then": [ - "* ", - "Онда " - ], - "when": [ - "* ", - "Када ", - "Кад " - ] - }, - "sr-Latn": { - "and": [ - "* ", - "I " - ], - "background": [ - "Kontekst", - "Osnova", - "Pozadina" - ], - "but": [ - "* ", - "Ali " - ], - "examples": [ - "Primeri", - "Scenariji" - ], - "feature": [ - "Funkcionalnost", - "Mogućnost", - "Mogucnost", - "Osobina" - ], - "given": [ - "* ", - "Za dato ", - "Za date ", - "Za dati " - ], - "name": "Serbian (Latin)", - "native": "Srpski (Latinica)", - "rule": [ - "Pravilo" - ], - "scenario": [ - "Scenario", - "Primer" - ], - "scenarioOutline": [ - "Struktura scenarija", - "Skica", - "Koncept" - ], - "then": [ - "* ", - "Onda " - ], - "when": [ - "* ", - "Kada ", - "Kad " - ] - }, - "sv": { - "and": [ - "* ", - "Och " - ], - "background": [ - "Bakgrund" - ], - "but": [ - "* ", - "Men " - ], - "examples": [ - "Exempel" - ], - "feature": [ - "Egenskap" - ], - "given": [ - "* ", - "Givet " - ], - "name": "Swedish", - "native": "Svenska", - "rule": [ - "Regel" - ], - "scenario": [ - "Scenario" - ], - "scenarioOutline": [ - "Abstrakt Scenario", - "Scenariomall" - ], - "then": [ - "* ", - "Så " - ], - "when": [ - "* ", - "När " - ] - }, - "ta": { - "and": [ - "* ", - "மேலும் ", - "மற்றும் " - ], - "background": [ - "பின்னணி" - ], - "but": [ - "* ", - "ஆனால் " - ], - "examples": [ - "எடுத்துக்காட்டுகள்", - "காட்சிகள்", - "நிலைமைகளில்" - ], - "feature": [ - "அம்சம்", - "வணிக தேவை", - "திறன்" - ], - "given": [ - "* ", - "கொடுக்கப்பட்ட " - ], - "name": "Tamil", - "native": "தமிழ்", - "rule": [ - "Rule" - ], - "scenario": [ - "உதாரணமாக", - "காட்சி" - ], - "scenarioOutline": [ - "காட்சி சுருக்கம்", - "காட்சி வார்ப்புரு" - ], - "then": [ - "* ", - "அப்பொழுது " - ], - "when": [ - "* ", - "எப்போது " - ] - }, - "th": { - "and": [ - "* ", - "และ " - ], - "background": [ - "แนวคิด" - ], - "but": [ - "* ", - "แต่ " - ], - "examples": [ - "ชุดของตัวอย่าง", - "ชุดของเหตุการณ์" - ], - "feature": [ - "โครงหลัก", - "ความต้องการทางธุรกิจ", - "ความสามารถ" - ], - "given": [ - "* ", - "กำหนดให้ " - ], - "name": "Thai", - "native": "ไทย", - "rule": [ - "Rule" - ], - "scenario": [ - "เหตุการณ์" - ], - "scenarioOutline": [ - "สรุปเหตุการณ์", - "โครงสร้างของเหตุการณ์" - ], - "then": [ - "* ", - "ดังนั้น " - ], - "when": [ - "* ", - "เมื่อ " - ] - }, - "te": { - "and": [ - "* ", - "మరియు " - ], - "background": [ - "నేపథ్యం" - ], - "but": [ - "* ", - "కాని " - ], - "examples": [ - "ఉదాహరణలు" - ], - "feature": [ - "గుణము" - ], - "given": [ - "* ", - "చెప్పబడినది " - ], - "name": "Telugu", - "native": "తెలుగు", - "rule": [ - "Rule" - ], - "scenario": [ - "ఉదాహరణ", - "సన్నివేశం" - ], - "scenarioOutline": [ - "కథనం" - ], - "then": [ - "* ", - "అప్పుడు " - ], - "when": [ - "* ", - "ఈ పరిస్థితిలో " - ] - }, - "tlh": { - "and": [ - "* ", - "'ej ", - "latlh " - ], - "background": [ - "mo'" - ], - "but": [ - "* ", - "'ach ", - "'a " - ], - "examples": [ - "ghantoH", - "lutmey" - ], - "feature": [ - "Qap", - "Qu'meH 'ut", - "perbogh", - "poQbogh malja'", - "laH" - ], - "given": [ - "* ", - "ghu' noblu' ", - "DaH ghu' bejlu' " - ], - "name": "Klingon", - "native": "tlhIngan", - "rule": [ - "Rule" - ], - "scenario": [ - "lut" - ], - "scenarioOutline": [ - "lut chovnatlh" - ], - "then": [ - "* ", - "vaj " - ], - "when": [ - "* ", - "qaSDI' " - ] - }, - "tr": { - "and": [ - "* ", - "Ve " - ], - "background": [ - "Geçmiş" - ], - "but": [ - "* ", - "Fakat ", - "Ama " - ], - "examples": [ - "Örnekler" - ], - "feature": [ - "Özellik" - ], - "given": [ - "* ", - "Diyelim ki " - ], - "name": "Turkish", - "native": "Türkçe", - "rule": [ - "Kural" - ], - "scenario": [ - "Örnek", - "Senaryo" - ], - "scenarioOutline": [ - "Senaryo taslağı" - ], - "then": [ - "* ", - "O zaman " - ], - "when": [ - "* ", - "Eğer ki " - ] - }, - "tt": { - "and": [ - "* ", - "Һәм ", - "Вә " - ], - "background": [ - "Кереш" - ], - "but": [ - "* ", - "Ләкин ", - "Әмма " - ], - "examples": [ - "Үрнәкләр", - "Мисаллар" - ], - "feature": [ - "Мөмкинлек", - "Үзенчәлеклелек" - ], - "given": [ - "* ", - "Әйтик " - ], - "name": "Tatar", - "native": "Татарча", - "rule": [ - "Rule" - ], - "scenario": [ - "Сценарий" - ], - "scenarioOutline": [ - "Сценарийның төзелеше" - ], - "then": [ - "* ", - "Нәтиҗәдә " - ], - "when": [ - "* ", - "Әгәр " - ] - }, - "uk": { - "and": [ - "* ", - "І ", - "А також ", - "Та " - ], - "background": [ - "Передумова" - ], - "but": [ - "* ", - "Але " - ], - "examples": [ - "Приклади" - ], - "feature": [ - "Функціонал" - ], - "given": [ - "* ", - "Припустимо ", - "Припустимо, що ", - "Нехай ", - "Дано " - ], - "name": "Ukrainian", - "native": "Українська", - "rule": [ - "Rule" - ], - "scenario": [ - "Приклад", - "Сценарій" - ], - "scenarioOutline": [ - "Структура сценарію" - ], - "then": [ - "* ", - "То ", - "Тоді " - ], - "when": [ - "* ", - "Якщо ", - "Коли " - ] - }, - "ur": { - "and": [ - "* ", - "اور " - ], - "background": [ - "پس منظر" - ], - "but": [ - "* ", - "لیکن " - ], - "examples": [ - "مثالیں" - ], - "feature": [ - "صلاحیت", - "کاروبار کی ضرورت", - "خصوصیت" - ], - "given": [ - "* ", - "اگر ", - "بالفرض ", - "فرض کیا " - ], - "name": "Urdu", - "native": "اردو", - "rule": [ - "Rule" - ], - "scenario": [ - "منظرنامہ" - ], - "scenarioOutline": [ - "منظر نامے کا خاکہ" - ], - "then": [ - "* ", - "پھر ", - "تب " - ], - "when": [ - "* ", - "جب " - ] - }, - "uz": { - "and": [ - "* ", - "Ва " - ], - "background": [ - "Тарих" - ], - "but": [ - "* ", - "Лекин ", - "Бирок ", - "Аммо " - ], - "examples": [ - "Мисоллар" - ], - "feature": [ - "Функционал" - ], - "given": [ - "* ", - "Belgilangan " - ], - "name": "Uzbek", - "native": "Узбекча", - "rule": [ - "Rule" - ], - "scenario": [ - "Сценарий" - ], - "scenarioOutline": [ - "Сценарий структураси" - ], - "then": [ - "* ", - "Унда " - ], - "when": [ - "* ", - "Агар " - ] - }, - "vi": { - "and": [ - "* ", - "Và " - ], - "background": [ - "Bối cảnh" - ], - "but": [ - "* ", - "Nhưng " - ], - "examples": [ - "Dữ liệu" - ], - "feature": [ - "Tính năng" - ], - "given": [ - "* ", - "Biết ", - "Cho " - ], - "name": "Vietnamese", - "native": "Tiếng Việt", - "rule": [ - "Rule" - ], - "scenario": [ - "Tình huống", - "Kịch bản" - ], - "scenarioOutline": [ - "Khung tình huống", - "Khung kịch bản" - ], - "then": [ - "* ", - "Thì " - ], - "when": [ - "* ", - "Khi " - ] - }, - "zh-CN": { - "and": [ - "* ", - "而且", - "并且", - "同时" - ], - "background": [ - "背景" - ], - "but": [ - "* ", - "但是" - ], - "examples": [ - "例子" - ], - "feature": [ - "功能" - ], - "given": [ - "* ", - "假如", - "假设", - "假定" - ], - "name": "Chinese simplified", - "native": "简体中文", - "rule": [ - "Rule", - "规则" - ], - "scenario": [ - "场景", - "剧本" - ], - "scenarioOutline": [ - "场景大纲", - "剧本大纲" - ], - "then": [ - "* ", - "那么" - ], - "when": [ - "* ", - "当" - ] - }, - "zh-TW": { - "and": [ - "* ", - "而且", - "並且", - "同時" - ], - "background": [ - "背景" - ], - "but": [ - "* ", - "但是" - ], - "examples": [ - "例子" - ], - "feature": [ - "功能" - ], - "given": [ - "* ", - "假如", - "假設", - "假定" - ], - "name": "Chinese traditional", - "native": "繁體中文", - "rule": [ - "Rule" - ], - "scenario": [ - "場景", - "劇本" - ], - "scenarioOutline": [ - "場景大綱", - "劇本大綱" - ], - "then": [ - "* ", - "那麼" - ], - "when": [ - "* ", - "當" - ] - }, - "mr": { - "and": [ - "* ", - "आणि ", - "तसेच " - ], - "background": [ - "पार्श्वभूमी" - ], - "but": [ - "* ", - "पण ", - "परंतु " - ], - "examples": [ - "उदाहरण" - ], - "feature": [ - "वैशिष्ट्य", - "सुविधा" - ], - "given": [ - "* ", - "जर", - "दिलेल्या प्रमाणे " - ], - "name": "Marathi", - "native": "मराठी", - "rule": [ - "नियम" - ], - "scenario": [ - "परिदृश्य" - ], - "scenarioOutline": [ - "परिदृश्य रूपरेखा" - ], - "then": [ - "* ", - "मग ", - "तेव्हा " - ], - "when": [ - "* ", - "जेव्हा " - ] - }, - "amh": { - "and": [ - "* ", - "እና " - ], - "background": [ - "ቅድመ ሁኔታ", - "መነሻ", - "መነሻ ሀሳብ" - ], - "but": [ - "* ", - "ግን " - ], - "examples": [ - "ምሳሌዎች", - "ሁናቴዎች" - ], - "feature": [ - "ስራ", - "የተፈለገው ስራ", - "የሚፈለገው ድርጊት" - ], - "given": [ - "* ", - "የተሰጠ " - ], - "name": "Amharic", - "native": "አማርኛ", - "rule": [ - "ህግ" - ], - "scenario": [ - "ምሳሌ", - "ሁናቴ" - ], - "scenarioOutline": [ - "ሁናቴ ዝርዝር", - "ሁናቴ አብነት" - ], - "then": [ - "* ", - "ከዚያ " - ], - "when": [ - "* ", - "መቼ " - ] - } -} diff --git a/perl/gherkin.berp b/perl/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/perl/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/perl/helper-scripts/build_languages.pl b/perl/helper-scripts/build_languages.pl index 160f8ad3e..fa1fa6cff 100755 --- a/perl/helper-scripts/build_languages.pl +++ b/perl/helper-scripts/build_languages.pl @@ -9,8 +9,8 @@ my $json = Cpanel::JSON::XS->new; -open( my $fh, '<', 'gherkin-languages.json' ) - || die "Can't open [gherkin-languages.json]"; +open( my $fh, '<', '../gherkin-languages.json' ) + || die "Can't open [../gherkin-languages.json]"; my $input = join '', (<$fh>); close $fh; diff --git a/perl/lib/Gherkin.pm b/perl/lib/Gherkin.pm index d5ca5900f..cdce49e45 100644 --- a/perl/lib/Gherkin.pm +++ b/perl/lib/Gherkin.pm @@ -149,7 +149,7 @@ the C<$sink>, whereas the current version sends L. The Cucumber toolkit consists of a set of tools which form a pipe line: each consumes and produces protobuf messages -(See L). Messages +(See L). Messages use ndjson formatting. The start of the pipeline is the Gherkin language parser. C diff --git a/php/.github/ISSUE_TEMPLATE.md b/php/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/php/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/php/.github/PULL_REQUEST_TEMPLATE.md b/php/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/php/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/php/.gitignore b/php/.gitignore index 85601ecb0..4a6f7c9af 100644 --- a/php/.gitignore +++ b/php/.gitignore @@ -1,3 +1,4 @@ +build acceptance vendor composer.lock diff --git a/php/.php-cs-fixer.php b/php/.php-cs-fixer.php index 13b7d65fa..19900a8f2 100644 --- a/php/.php-cs-fixer.php +++ b/php/.php-cs-fixer.php @@ -2,7 +2,6 @@ $finder = PhpCsFixer\Finder::create() ->in([ __DIR__ . '/src', - __DIR__ . '/src-generated', __DIR__ . '/tests', __DIR__ . '/bin', ]) diff --git a/php/.rsync b/php/.rsync deleted file mode 100644 index 4d14e5474..000000000 --- a/php/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../LICENSE LICENSE -../../.templates/github/ .github/ -../../.templates/php/ . -../gherkin.berp gherkin.berp -../gherkin-languages.json resources/gherkin-languages.json diff --git a/php/.subrepo b/php/.subrepo deleted file mode 100644 index c42cbea50..000000000 --- a/php/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-php diff --git a/php/LICENSE b/php/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/php/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/php/Makefile b/php/Makefile index 8e8e10bab..034aa6b59 100644 --- a/php/Makefile +++ b/php/Makefile @@ -1,59 +1,84 @@ -include default.mk +SHELL := /usr/bin/env bash + +GHERKIN_LANGUAGES_JSON = resources/gherkin-languages.json +GHERKIN_PARSER = src-generated/Parser.php +GHERKIN_RAZOR = gherkin-php.razor +SOURCE_FILES = $(shell find . -name "*.php" | grep -v $(GHERKIN_PARSER)) + +GHERKIN = bin/gherkin +GHERKIN_GENERATE_TOKENS = bin/gherkin-generate-tokens GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature") BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature") -TOKENS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.tokens,$(GOOD_FEATURE_FILES)) -ASTS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.ast.ndjson,$(GOOD_FEATURE_FILES)) -PICKLES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.pickles.ndjson,$(GOOD_FEATURE_FILES)) -SOURCES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.source.ndjson,$(GOOD_FEATURE_FILES)) -ERRORS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.errors.ndjson,$(BAD_FEATURE_FILES)) +TOKENS = $(patsubst ../testdata/%,acceptance/testdata/%.tokens,$(GOOD_FEATURE_FILES)) +ASTS = $(patsubst ../testdata/%,acceptance/testdata/%.ast.ndjson,$(GOOD_FEATURE_FILES)) +PICKLES = $(patsubst ../testdata/%,acceptance/testdata/%.pickles.ndjson,$(GOOD_FEATURE_FILES)) +SOURCES = $(patsubst ../testdata/%,acceptance/testdata/%.source.ndjson,$(GOOD_FEATURE_FILES)) +ERRORS = $(patsubst ../testdata/%,acceptance/testdata/%.errors.ndjson,$(BAD_FEATURE_FILES)) + +.DEFAULT_GOAL = help + +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +generate: $(GHERKIN_PARSER) ## Generate gherkin parser files + +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) + +copy-gherkin-languages: $(GHERKIN_LANGUAGES_JSON) ## Copy gherkin-languages.json and/or generate derived files + +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + rm -f $(GHERKIN_LANGUAGES_JSON) + +clean: ## Remove all build artifacts and files generated by the acceptance tests + rm -f .built + rm -rf acceptance + rm -rf vendor .DELETE_ON_ERROR: -default: .compared +acceptance: .built $(TOKENS) $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) ## Build acceptance test dir and compare results with reference -.compared: .deps $(TOKENS) $(SOURCES) $(ASTS) $(PICKLES) $(ERRORS) +.built: vendor $(SOURCE_FILES) touch $@ -acceptance/testdata/%.feature.tokens: ../testdata/%.feature ../testdata/%.feature.tokens - mkdir -p $(@D) - bin/gherkin-generate-tokens $< > $@ - diff --unified $<.tokens $@ +vendor: composer.json + composer update + +$(GHERKIN_PARSER): $(GHERKIN_RAZOR) ../gherkin.berp + mkdir -p build + berp -g ../gherkin.berp -t $< -o build/classes.php --noBOM + csplit --quiet --prefix=build/Generated --suffix-format=%02d.php.tmp --elide-empty-files build/classes.php /^[A-Za-z\/]*\.php$$/ {*} + for file in build/Generated**; do mkdir -p src-generated/$$(head -n 1 $$file | sed 's/[^/]*.php$$//'); done + for file in build/Generated**; do tail -n +2 $$file > src-generated/$$(head -n 1 $$file); rm $$file; done + rm -f build/classes.php -acceptance/testdata/%.feature.source.ndjson: ../testdata/%.feature ../testdata/%.feature.source.ndjson .deps +$(GHERKIN_LANGUAGES_JSON): + cp ../gherkin-languages.json $@ + +acceptance/testdata/%.tokens: ../testdata/% ../testdata/%.tokens mkdir -p $(@D) - bin/gherkin --predictable-ids --no-ast --no-pickles $< | jq --sort-keys --compact-output "." > $@ - diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) + $(GHERKIN_GENERATE_TOKENS) $< > $@ + diff --unified $<.tokens $@ -acceptance/testdata/%.feature.ast.ndjson: ../testdata/%.feature ../testdata/%.feature.ast.ndjson .deps +acceptance/testdata/%.ast.ndjson: ../testdata/% ../testdata/%.ast.ndjson mkdir -p $(@D) - bin/gherkin --predictable-ids --no-source --no-pickles $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.ast.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.pickles.ndjson: ../testdata/%.feature ../testdata/%.feature.pickles.ndjson .deps +acceptance/testdata/%.pickles.ndjson: ../testdata/% ../testdata/%.pickles.ndjson mkdir -p $(@D) - bin/gherkin --predictable-ids --no-source --no-ast $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-ast --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.pickles.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.errors.ndjson: ../testdata/%.feature ../testdata/%.feature.errors.ndjson .deps +acceptance/testdata/%.source.ndjson: ../testdata/% ../testdata/%.source.ndjson mkdir -p $(@D) - bin/gherkin --predictable-ids --no-source $< | jq --sort-keys --compact-output "." > $@ - diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) - - -.codegen: build/classes.php - -build/classes.php: gherkin-php.razor gherkin.berp - $(berp-generate-parser) - csplit --quiet --prefix=build/Generated --suffix-format=%02d.php.tmp --elide-empty-files build/classes.php /^.*.php$$/ {*} - for file in build/Generated**; do mkdir -p src-generated/$$(head -n 1 $$file | sed 's/[^/]*.php$$//'); done - for file in build/Generated**; do tail -n +2 $$file > src-generated/$$(head -n 1 $$file); rm $$file; done - vendor/bin/php-cs-fixer --diff fix src-generated - -clean-build: - rm -rf build/classes.php - rm -rf src-generated/* - rm -rf .compared acceptance + $(GHERKIN) --no-ast --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) -clean: clean-build +acceptance/testdata/%.errors.ndjson: ../testdata/% ../testdata/%.errors.ndjson + mkdir -p $(@D) + $(GHERKIN) --no-source --predictable-ids $< | jq --sort-keys --compact-output "." > $@ + diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) diff --git a/php/build/.gitignore b/php/build/.gitignore deleted file mode 100644 index e426c3407..000000000 --- a/php/build/.gitignore +++ /dev/null @@ -1 +0,0 @@ -classes.php diff --git a/php/default.mk b/php/default.mk deleted file mode 100644 index f028c7713..000000000 --- a/php/default.mk +++ /dev/null @@ -1,62 +0,0 @@ -# Please update /.templates/php/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -PHP_SOURCE_FILES = $(shell find . -name "*.php") - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef - -### Common targets for all functionalities implemented on php - -default: .tested -.PHONY: default - -pre-release: update-version update-dependencies default -.PHONY: pre-release - -update-version: -ifdef NEW_VERSION -# no-op: composer rely on git tags -endif -.PHONY: update-version - -update-dependencies: - composer update ${COMPOSER_FLAGS} -.PHONY: update-dependencies - -publish: -# no-op: composer will rely on the subrepo tag -.PHONY: publish - -post-release: -# no-op -.PHONY: post-release - -clean: - rm -rf .tested .deps .codegen - rm -rf vendor composer.lock -.PHONY: clean - -.tested: .deps $(PHP_SOURCE_FILES) - vendor/bin/php-cs-fixer --dry-run --diff fix - vendor/bin/psalm --no-cache - vendor/bin/phpunit - touch $@ - -.deps: vendor .codegen - touch $@ - -.codegen: - touch $@ - -vendor: composer.json - composer update ${COMPOSER_FLAGS} diff --git a/php/gherkin-php.razor b/php/gherkin-php.razor index 13e82d438..d2e54098e 100644 --- a/php/gherkin-php.razor +++ b/php/gherkin-php.razor @@ -28,7 +28,9 @@ @helper matchToken(TokenType tokenType) {$this->match_@(tokenType)($context, $token)} Parser/TokenMatcherInterface.php - case @rule.Name.Replace("#", ""); - } + } } - Parser/RuleType.php - !r.TempRule)) { case @rule.Name.Replace("#", "_"); // @rule.ToString(true) - } + } } - Parser.php - - */ + /** + * @@use ParserTrait + */ use ParserTrait; @foreach(var rule in Model.RuleSet.TokenRules) { - private function match_@(rule.Name.Replace("#", ""))(ParserContext $context, Token $token) : bool + private function match_@(rule.Name.Replace("#", ""))(ParserContext $context, Token $token): bool { @if (rule.Name != "#EOF") { @@ -137,17 +142,16 @@ final class @Model.ParserClassName } return $this->handleExternalError( $context, - fn() => $context->tokenMatcher->match_@(rule.Name.Replace("#", ""))($token), + fn () => $context->tokenMatcher->match_@(rule.Name.Replace("#", ""))($token), false, ); } } - private function matchToken(int $state, Token $token, ParserContext $context) : int + private function matchToken(int $state, Token $token, ParserContext $context): int { - return match($state) - { + return match ($state) { @foreach(var state in Model.States.Values.Where(s => !s.IsEndState)) { @:@state.Id => $this->matchTokenAt_@(state.Id)($token, $context), @@ -160,15 +164,14 @@ final class @Model.ParserClassName { // @Raw(state.Comment) - private function matchTokenAt_@(state.Id)(Token $token, ParserContext $context) : int + private function matchTokenAt_@(state.Id)(Token $token, ParserContext $context): int { @foreach(var transition in state.Transitions) { @:if (@matchToken(transition.TokenType)) { if (transition.LookAheadHint != null) { - @:if ($this->lookahead_@(transition.LookAheadHint.Id)($context)) - @:{ + @:if ($this->lookahead_@(transition.LookAheadHint.Id)($context)) { } foreach(var production in transition.Productions) { @@ -189,12 +192,11 @@ final class @Model.ParserClassName @foreach(var lookAheadHint in Model.RuleSet.LookAheadHints) { - private function lookahead_@(lookAheadHint.Id)(ParserContext $context) : bool + private function lookahead_@(lookAheadHint.Id)(ParserContext $context): bool { $queue = []; $match = false; - do - { + do { $token = $this->readToken($context); $queue[] = $token; @@ -203,8 +205,8 @@ final class @Model.ParserClassName { @:|| @matchToken(tokenType) } - ) - { + + ) { $match = true; break; } @@ -213,6 +215,7 @@ final class @Model.ParserClassName { @:|| @matchToken(tokenType) } + ); $context->tokenQueue = [...$context->tokenQueue, ...$queue]; @@ -221,6 +224,4 @@ final class @Model.ParserClassName } } - - } diff --git a/php/gherkin.berp b/php/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/php/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/php/src-generated/Parser.php b/php/src-generated/Parser.php index 0886c26d0..7c016b7be 100644 --- a/php/src-generated/Parser.php +++ b/php/src-generated/Parser.php @@ -398,11 +398,11 @@ private function matchTokenAt_3(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::FeatureHeader); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::FeatureHeader); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -468,12 +468,12 @@ private function matchTokenAt_4(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::FeatureHeader); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::FeatureHeader); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -538,11 +538,11 @@ private function matchTokenAt_5(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::FeatureHeader); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::FeatureHeader); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -607,11 +607,11 @@ private function matchTokenAt_6(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -676,12 +676,12 @@ private function matchTokenAt_7(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -745,11 +745,11 @@ private function matchTokenAt_8(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -818,12 +818,12 @@ private function matchTokenAt_9(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -895,13 +895,13 @@ private function matchTokenAt_10(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::DataTable); - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::DataTable); + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1010,20 +1010,20 @@ private function matchTokenAt_12(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1098,22 +1098,22 @@ private function matchTokenAt_13(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Description); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->endRule($context, RuleType::Description); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1188,20 +1188,20 @@ private function matchTokenAt_14(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1280,22 +1280,22 @@ private function matchTokenAt_15(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Step); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->endRule($context, RuleType::Step); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1378,24 +1378,24 @@ private function matchTokenAt_16(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::DataTable); - $this->endRule($context, RuleType::Step); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->endRule($context, RuleType::DataTable); + $this->endRule($context, RuleType::Step); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::DataTable); - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::DataTable); + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1517,24 +1517,24 @@ private function matchTokenAt_18(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1619,26 +1619,26 @@ private function matchTokenAt_19(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1723,24 +1723,24 @@ private function matchTokenAt_20(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1817,26 +1817,26 @@ private function matchTokenAt_21(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::ExamplesTable); - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->endRule($context, RuleType::ExamplesTable); + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::ExamplesTable); - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::ExamplesTable); + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -1960,11 +1960,11 @@ private function matchTokenAt_23(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::RuleHeader); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::RuleHeader); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2033,12 +2033,12 @@ private function matchTokenAt_24(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::RuleHeader); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::RuleHeader); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2106,11 +2106,11 @@ private function matchTokenAt_25(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::RuleHeader); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::RuleHeader); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2178,11 +2178,11 @@ private function matchTokenAt_26(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2250,12 +2250,12 @@ private function matchTokenAt_27(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2322,11 +2322,11 @@ private function matchTokenAt_28(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2398,12 +2398,12 @@ private function matchTokenAt_29(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2478,13 +2478,13 @@ private function matchTokenAt_30(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::DataTable); - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::DataTable); + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2596,20 +2596,20 @@ private function matchTokenAt_32(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2687,22 +2687,22 @@ private function matchTokenAt_33(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Description); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->endRule($context, RuleType::Description); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2780,20 +2780,20 @@ private function matchTokenAt_34(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2875,22 +2875,22 @@ private function matchTokenAt_35(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Step); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->endRule($context, RuleType::Step); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -2976,24 +2976,24 @@ private function matchTokenAt_36(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::DataTable); - $this->endRule($context, RuleType::Step); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->endRule($context, RuleType::DataTable); + $this->endRule($context, RuleType::Step); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::DataTable); - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::DataTable); + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -3118,24 +3118,24 @@ private function matchTokenAt_38(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -3223,26 +3223,26 @@ private function matchTokenAt_39(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Description); - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Description); + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -3330,24 +3330,24 @@ private function matchTokenAt_40(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -3427,26 +3427,26 @@ private function matchTokenAt_41(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::ExamplesTable); - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->endRule($context, RuleType::ExamplesTable); + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::ExamplesTable); - $this->endRule($context, RuleType::Examples); - $this->endRule($context, RuleType::ExamplesDefinition); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::ExamplesTable); + $this->endRule($context, RuleType::Examples); + $this->endRule($context, RuleType::ExamplesDefinition); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -3559,24 +3559,24 @@ private function matchTokenAt_44(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::DocString); - $this->endRule($context, RuleType::Step); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 37; + $this->endRule($context, RuleType::DocString); + $this->endRule($context, RuleType::Step); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 37; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::DocString); - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::DocString); + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -3684,13 +3684,13 @@ private function matchTokenAt_46(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::DocString); - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 31; + $this->endRule($context, RuleType::DocString); + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 31; } } if ($this->match_TagLine($context, $token)) { @@ -3787,24 +3787,24 @@ private function matchTokenAt_48(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_1($context)) { - $this->endRule($context, RuleType::DocString); - $this->endRule($context, RuleType::Step); - $this->startRule($context, RuleType::ExamplesDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 17; + $this->endRule($context, RuleType::DocString); + $this->endRule($context, RuleType::Step); + $this->startRule($context, RuleType::ExamplesDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 17; } } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::DocString); - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Scenario); - $this->endRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::DocString); + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Scenario); + $this->endRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { @@ -3909,13 +3909,13 @@ private function matchTokenAt_50(Token $token, ParserContext $context): int } if ($this->match_TagLine($context, $token)) { if ($this->lookahead_0($context)) { - $this->endRule($context, RuleType::DocString); - $this->endRule($context, RuleType::Step); - $this->endRule($context, RuleType::Background); - $this->startRule($context, RuleType::ScenarioDefinition); - $this->startRule($context, RuleType::Tags); - $this->build($context, $token); - return 11; + $this->endRule($context, RuleType::DocString); + $this->endRule($context, RuleType::Step); + $this->endRule($context, RuleType::Background); + $this->startRule($context, RuleType::ScenarioDefinition); + $this->startRule($context, RuleType::Tags); + $this->build($context, $token); + return 11; } } if ($this->match_TagLine($context, $token)) { diff --git a/python/.github/ISSUE_TEMPLATE.md b/python/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/python/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/python/.github/PULL_REQUEST_TEMPLATE.md b/python/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/python/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/python/.rsync b/python/.rsync deleted file mode 100644 index 8b2ad86f2..000000000 --- a/python/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../LICENSE LICENSE.txt -../../.templates/github/ .github/ -../../.templates/python/ . -../gherkin.berp gherkin.berp -../gherkin-languages.json gherkin/gherkin-languages.json diff --git a/python/.subrepo b/python/.subrepo deleted file mode 100644 index 6c579fae9..000000000 --- a/python/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-python diff --git a/python/LICENSE.txt b/python/LICENSE.txt deleted file mode 100644 index 29e136102..000000000 --- a/python/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/python/Makefile b/python/Makefile index 169d20758..76db3bf94 100644 --- a/python/Makefile +++ b/python/Makefile @@ -1,74 +1,75 @@ SHELL := /usr/bin/env bash -GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature" -o -name "*.feature.md") -BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature" -o -name "*.feature.md") -TOKENS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.tokens,$(GOOD_FEATURE_FILES)) -ASTS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.ast.ndjson,$(GOOD_FEATURE_FILES)) -PICKLES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.pickles.ndjson,$(GOOD_FEATURE_FILES)) -SOURCES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.source.ndjson,$(GOOD_FEATURE_FILES)) -ERRORS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.errors.ndjson,$(BAD_FEATURE_FILES)) +GHERKIN_LANGUAGES_JSON = gherkin/gherkin-languages.json +GHERKIN_PARSER = gherkin/parser.py +GHERKIN_RAZOR = gherkin-python.razor +SOURCE_FILES = $(shell find . -name "*.py" | grep -v $(GHERKIN_PARSER)) -PYTHON_FILES = $(shell find . -name "*.py") -PYTHONPATH ?= $(PWD) -export PYTHONPATH +GHERKIN = bin/gherkin +GHERKIN_GENERATE_TOKENS = bin/gherkin-generate-tokens -.DELETE_ON_ERROR: +GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature") +BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature") -default: .built .compared -.PHONY: all +TOKENS = $(patsubst ../testdata/%,acceptance/testdata/%.tokens,$(GOOD_FEATURE_FILES)) +ASTS = $(patsubst ../testdata/%,acceptance/testdata/%.ast.ndjson,$(GOOD_FEATURE_FILES)) +PICKLES = $(patsubst ../testdata/%,acceptance/testdata/%.pickles.ndjson,$(GOOD_FEATURE_FILES)) +SOURCES = $(patsubst ../testdata/%,acceptance/testdata/%.source.ndjson,$(GOOD_FEATURE_FILES)) +ERRORS = $(patsubst ../testdata/%,acceptance/testdata/%.errors.ndjson,$(BAD_FEATURE_FILES)) -.compared: $(TOKENS) $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) - touch $@ +.DEFAULT_GOAL = help -.built: gherkin/parser.py gherkin/gherkin-languages.json $(PYTHON_FILES) bin/gherkin .pipped - $(MAKE) test - touch $@ +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +generate: $(GHERKIN_PARSER) ## Generate gherkin parser files + +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) + +copy-gherkin-languages: $(GHERKIN_LANGUAGES_JSON) ## Copy gherkin-languages.json and/or generate derived files + +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + rm -f $(GHERKIN_LANGUAGES_JSON) + +clean: ## Remove all build artifacts and files generated by the acceptance tests + rm -f .built + rm -rf acceptance -.PHONY: test -test: gherkin/parser.py - # "pytest" is most likely installed in $(HOME)/.local/bin since normal - # site-packages most likely is not writeable - @echo "$(@): USE PYTHONPATH=$(PYTHONPATH)" - PATH=$(PATH):$(HOME)/.local/bin pytest +.DELETE_ON_ERROR: + +acceptance: .built $(TOKENS) $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) ## Build acceptance test dir and compare results with reference -.pipped: - pip install -r requirements.txt +.built: $(SOURCE_FILES) touch $@ -acceptance/testdata/%.feature.tokens: ../testdata/%.feature ../testdata/%.feature.tokens +$(GHERKIN_PARSER): $(GHERKIN_RAZOR) ../gherkin.berp + berp -g ../gherkin.berp -t $< -o $@ --noBOM + +$(GHERKIN_LANGUAGES_JSON): + cp ../gherkin-languages.json $@ + +acceptance/testdata/%.tokens: ../testdata/% ../testdata/%.tokens mkdir -p $(@D) - bin/gherkin-generate-tokens $< > $@ + $(GHERKIN_GENERATE_TOKENS) $< > $@ diff --unified $<.tokens $@ -acceptance/testdata/%.feature.ast.ndjson: ../testdata/%.feature ../testdata/%.feature.ast.ndjson +acceptance/testdata/%.ast.ndjson: ../testdata/% ../testdata/%.ast.ndjson mkdir -p $(@D) - bin/gherkin --no-source --no-pickles $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-pickles $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.ast.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.pickles.ndjson: ../testdata/%.feature ../testdata/%.feature.pickles.ndjson +acceptance/testdata/%.pickles.ndjson: ../testdata/% ../testdata/%.pickles.ndjson mkdir -p $(@D) - bin/gherkin --no-source --no-ast $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-ast $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.pickles.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.source.ndjson: ../testdata/%.feature ../testdata/%.feature.source.ndjson +acceptance/testdata/%.source.ndjson: ../testdata/% ../testdata/%.source.ndjson mkdir -p $(@D) - bin/gherkin --no-ast --no-pickles $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-ast --no-pickles $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.errors.ndjson: ../testdata/%.feature ../testdata/%.feature.errors.ndjson +acceptance/testdata/%.errors.ndjson: ../testdata/% ../testdata/%.errors.ndjson mkdir -p $(@D) - bin/gherkin --no-source $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) - -clean: - rm -rf .compared .built .pipped acceptance -.PHONY: clean - -clobber: clean - rm -rf gherkin/parser.py -.PHONY: clobber - -gherkin/parser.py: gherkin-python.razor gherkin.berp - $(berp-generate-parser) - -include default.mk diff --git a/python/default.mk b/python/default.mk deleted file mode 100644 index f3a39fad1..000000000 --- a/python/default.mk +++ /dev/null @@ -1,47 +0,0 @@ -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) -IS_TESTDATA = $(findstring -testdata,${CURDIR}) -SETUP_PY = $(shell find . -name "setup.py") - -update-dependencies: - @echo "\033[0;31mPlease update dependencies for python manually!!\033[0m" -.PHONY: update-dependencies - -pre-release: update-version update-dependencies clean default -.PHONY: pre-release - -update-version: -ifdef NEW_VERSION -ifneq (,$(SETUP_PY)) - sed -i \ - -e "s/\(version *= *\"\)[0-9]*\.[0-9]*\.[0-9]*\(\"\)/\1$(NEW_VERSION)\2/" \ - "setup.py" -endif -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-version - -publish: -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else - python2 setup.py sdist - python2 -m twine upload dist/* -endif -.PHONY: publish - -post-release: - @echo "No post-release needed for python" -.PHONY: post-release - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/python/gherkin.berp b/python/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/python/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/python/gherkin/stream/source_events.py b/python/gherkin/stream/source_events.py index 94f608a56..946b6bc62 100644 --- a/python/gherkin/stream/source_events.py +++ b/python/gherkin/stream/source_events.py @@ -4,7 +4,7 @@ def source_event(path): event = { 'source': { 'uri': path, - 'data': io.open(path, 'rU', encoding='utf8', newline='').read(), + 'data': io.open(path, 'r', encoding='utf8', newline='').read(), 'mediaType': 'text/x.cucumber.gherkin+plain' } } diff --git a/python/gherkin/token_scanner.py b/python/gherkin/token_scanner.py index cdcef0c25..531b51b25 100644 --- a/python/gherkin/token_scanner.py +++ b/python/gherkin/token_scanner.py @@ -19,7 +19,7 @@ class TokenScanner(object): def __init__(self, path_or_str): if os.path.exists(path_or_str): - self.io = io.open(path_or_str, 'rU', encoding='utf8') + self.io = io.open(path_or_str, 'r', encoding='utf8') else: if sys.version_info < (3, 0): if isinstance(path_or_str, str): diff --git a/ruby/.github/ISSUE_TEMPLATE.md b/ruby/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index fac961981..000000000 --- a/ruby/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE ISSUES IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your issue in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/issues diff --git a/ruby/.github/PULL_REQUEST_TEMPLATE.md b/ruby/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 2c0c878d9..000000000 --- a/ruby/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ -PLEASE DO NOT CREATE PULL REAUESTS IN THIS REPO. -THIS REPO IS A READ-ONLY MIRROR. - -Create your pull request in the Cucumber monorepo instead: -https://github.com/cucumber/cucumber/pulls diff --git a/ruby/.gitignore b/ruby/.gitignore index 2d16bb2af..cbf4e8135 100644 --- a/ruby/.gitignore +++ b/ruby/.gitignore @@ -4,7 +4,7 @@ acceptance/ pkg/ *.gem .compared -.deps +.built .tested* *-go *.iml diff --git a/ruby/.rsync b/ruby/.rsync deleted file mode 100644 index a6ee96221..000000000 --- a/ruby/.rsync +++ /dev/null @@ -1,5 +0,0 @@ -../LICENSE LICENSE -../../.templates/github/ .github/ -../../.templates/ruby/ . -../gherkin.berp gherkin.berp -../gherkin-languages.json lib/gherkin/gherkin-languages.json diff --git a/ruby/.subrepo b/ruby/.subrepo deleted file mode 100644 index 437d250e5..000000000 --- a/ruby/.subrepo +++ /dev/null @@ -1 +0,0 @@ -cucumber/gherkin-ruby diff --git a/ruby/LICENSE b/ruby/LICENSE deleted file mode 100644 index 29e136102..000000000 --- a/ruby/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/ruby/Makefile b/ruby/Makefile index 487323f3f..efd35b99b 100644 --- a/ruby/Makefile +++ b/ruby/Makefile @@ -1,55 +1,79 @@ -include default.mk +SHELL := /usr/bin/env bash + +GHERKIN_LANGUAGES_JSON = lib/gherkin/gherkin-languages.json +GHERKIN_PARSER = lib/gherkin/parser.rb +GHERKIN_RAZOR = gherkin-ruby.razor +SOURCE_FILES = $(shell find . -name "*.rb" | grep -v $(GHERKIN_PARSER)) + +GHERKIN = bundle exec bin/gherkin +GHERKIN_GENERATE_TOKENS = bundle exec bin/gherkin-generate-tokens GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature") BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature") -TOKENS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.tokens,$(GOOD_FEATURE_FILES)) -ASTS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.ast.ndjson,$(GOOD_FEATURE_FILES)) -PICKLES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.pickles.ndjson,$(GOOD_FEATURE_FILES)) -SOURCES = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.source.ndjson,$(GOOD_FEATURE_FILES)) -ERRORS = $(patsubst ../testdata/%.feature,acceptance/testdata/%.feature.errors.ndjson,$(BAD_FEATURE_FILES)) +TOKENS = $(patsubst ../testdata/%,acceptance/testdata/%.tokens,$(GOOD_FEATURE_FILES)) +ASTS = $(patsubst ../testdata/%,acceptance/testdata/%.ast.ndjson,$(GOOD_FEATURE_FILES)) +PICKLES = $(patsubst ../testdata/%,acceptance/testdata/%.pickles.ndjson,$(GOOD_FEATURE_FILES)) +SOURCES = $(patsubst ../testdata/%,acceptance/testdata/%.source.ndjson,$(GOOD_FEATURE_FILES)) +ERRORS = $(patsubst ../testdata/%,acceptance/testdata/%.errors.ndjson,$(BAD_FEATURE_FILES)) -.DELETE_ON_ERROR: +.DEFAULT_GOAL = help + +help: ## Show this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n\nWhere is one of:\n"} /^[$$()% a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +generate: $(GHERKIN_PARSER) ## Generate gherkin parser files + +clean-generate: ## Remove generated Gherkin parser files ## Generate gherkin parser files + rm -f $(GHERKIN_PARSER) + +copy-gherkin-languages: $(GHERKIN_LANGUAGES_JSON) ## Copy gherkin-languages.json and/or generate derived files + +clean-gherkin-languages: ## Remove gherkin-languages.json and any derived files + rm -f $(GHERKIN_LANGUAGES_JSON) -default: .compared +clean: ## Remove all build artifacts and files generated by the acceptance tests + rm -rf .built + rm -rf acceptance + rm -rf Gemfile.lock -.deps: lib/gherkin/parser.rb lib/gherkin/gherkin-languages.json bin/gherkin +.DELETE_ON_ERROR: + +acceptance: .built $(TOKENS) $(ASTS) $(PICKLES) $(ERRORS) $(SOURCES) ## Build acceptance test dir and compare results with reference -.compared: $(TOKENS) $(SOURCES) $(ASTS) $(PICKLES) $(ERRORS) +.built: Gemfile.lock $(SOURCE_FILES) touch $@ -acceptance/testdata/%.feature.tokens: ../testdata/%.feature ../testdata/%.feature.tokens .deps +Gemfile.lock: Gemfile cucumber-gherkin.gemspec + bundle install + +$(GHERKIN_PARSER): $(GHERKIN_RAZOR) ../gherkin.berp + berp -g ../gherkin.berp -t $< -o $@ --noBOM + +$(GHERKIN_LANGUAGES_JSON): + cp ../gherkin-languages.json $@ + +acceptance/testdata/%.tokens: ../testdata/% ../testdata/%.tokens mkdir -p $(@D) - bundle exec bin/gherkin-generate-tokens $< > $@ + $(GHERKIN_GENERATE_TOKENS) $< > $@ diff --unified $<.tokens $@ -acceptance/testdata/%.feature.ast.ndjson: ../testdata/%.feature ../testdata/%.feature.ast.ndjson .deps +acceptance/testdata/%.ast.ndjson: ../testdata/% ../testdata/%.ast.ndjson mkdir -p $(@D) - bundle exec bin/gherkin --predictable-ids --no-source --no-pickles $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.ast.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.pickles.ndjson: ../testdata/%.feature ../testdata/%.feature.pickles.ndjson .deps +acceptance/testdata/%.pickles.ndjson: ../testdata/% ../testdata/%.pickles.ndjson mkdir -p $(@D) - bundle exec bin/gherkin --predictable-ids --no-source --no-ast $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --no-ast --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.pickles.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.source.ndjson: ../testdata/%.feature ../testdata/%.feature.source.ndjson .deps +acceptance/testdata/%.source.ndjson: ../testdata/% ../testdata/%.source.ndjson mkdir -p $(@D) - bundle exec bin/gherkin --predictable-ids --no-ast --no-pickles $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-ast --no-pickles --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.source.ndjson) <(jq "." $@) -acceptance/testdata/%.feature.errors.ndjson: ../testdata/%.feature ../testdata/%.feature.errors.ndjson .deps +acceptance/testdata/%.errors.ndjson: ../testdata/% ../testdata/%.errors.ndjson mkdir -p $(@D) - bundle exec bin/gherkin --predictable-ids --no-source $< | jq --sort-keys --compact-output "." > $@ + $(GHERKIN) --no-source --predictable-ids $< | jq --sort-keys --compact-output "." > $@ diff --unified <(jq "." $<.errors.ndjson) <(jq "." $@) - -clean: - rm -rf .compared acceptance coverage -.PHONY: clean - -clobber: clean - rm -rf lib/gherkin/parser.rb Gemfile.lock -.PHONY: clobber - -lib/gherkin/parser.rb: gherkin-ruby.razor gherkin.berp - $(berp-generate-parser) diff --git a/ruby/README.md b/ruby/README.md index c76159e84..8de947169 100644 --- a/ruby/README.md +++ b/ruby/README.md @@ -1,6 +1,6 @@ # Gherkin for Ruby -Gherkin parser/compiler for Ruby. Please see [Gherkin](https://github.com/cucumber/common/tree/main/gherkin) for details. +Gherkin parser/compiler for Ruby. Please see [Gherkin](https://github.com/cucumber/gherkin) for details. ## To build diff --git a/ruby/cucumber-gherkin.gemspec b/ruby/cucumber-gherkin.gemspec index 7b20a93c5..987e4b7e6 100644 --- a/ruby/cucumber-gherkin.gemspec +++ b/ruby/cucumber-gherkin.gemspec @@ -13,11 +13,11 @@ Gem::Specification.new do |s| s.required_ruby_version = '>= 2.3' s.metadata = { - 'bug_tracker_uri' => 'https://github.com/cucumber/cucumber/issues', - 'changelog_uri' => 'https://github.com/cucumber/common/blob/main/gherkin/CHANGELOG.md', + 'bug_tracker_uri' => 'https://github.com/cucumber/gherkin/issues', + 'changelog_uri' => 'https://github.com/cucumber/gherkin/blob/main/CHANGELOG.md', 'documentation_uri' => 'https://cucumber.io/docs/gherkin/', 'mailing_list_uri' => 'https://groups.google.com/forum/#!forum/cukes', - 'source_code_uri' => 'https://github.com/cucumber/common/blob/main/gherkin/ruby' + 'source_code_uri' => 'https://github.com/cucumber/gherkin/blob/main/ruby' } s.add_dependency 'cucumber-messages', '~> 19.1', '>= 19.1.4' diff --git a/ruby/default.mk b/ruby/default.mk deleted file mode 100644 index cfa3f70b5..000000000 --- a/ruby/default.mk +++ /dev/null @@ -1,93 +0,0 @@ -SHELL := /usr/bin/env bash -RUBY_SOURCE_FILES = $(shell find . -name "*.rb") -GEMSPEC = $(shell find . -name "*.gemspec") -LIBNAME := $(shell basename $$(dirname $$(pwd))) -GEM := cucumber-$(LIBNAME)-$(NEW_VERSION).gem -IS_TESTDATA = $(findstring -testdata,${CURDIR}) - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: .tested -.PHONY: default - -.deps: Gemfile.lock - touch $@ - -Gemfile.lock: Gemfile $(GEMSPEC) - bundle install - touch $@ - -.tested: .deps $(RUBY_SOURCE_FILES) - bundle exec rspec --color - touch $@ - -update-dependencies: - ./scripts/update-gemspec -.PHONY: update-dependencies - -ifdef NEW_VERSION -ifneq (,$(GEMSPEC)) -gem: $(GEM) -else -gem: - @echo "Not building gem because there is no gemspec" -endif -endif -.PHONY: gem - -$(GEM): .tested - gem build $(GEMSPEC) - test -s "$(GEM)" || { echo "Gem not built: $(GEM)"; exit 1; } - -remove-local-dependencies: - cat Gemfile | sed 's/^gem /#gem /' > Gemfile.tmp - mv Gemfile.tmp Gemfile -.PHONY: remove-local-dependencies - -pre-release: remove-local-dependencies update-version update-dependencies gem -.PHONY: pre-release - -update-version: -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifdef NEW_VERSION - @echo "$(NEW_VERSION)" > VERSION -endif -endif -.PHONY: update-version - -publish: gem -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifneq (,$(GEMSPEC)) - gem push $(GEM) -else - @echo "Not publishing because there is no gemspec" -endif -endif -.PHONY: publish - -post-release: - cat Gemfile | sed 's/^#gem /gem /' > Gemfile.tmp - mv Gemfile.tmp Gemfile -.PHONY: post-release - -clean: clean-ruby -.PHONY: clean - -clean-ruby: - rm -rf .deps .linked .tested* Gemfile.lock *.gem acceptance -.PHONY: clean-ruby - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/ruby/gherkin.berp b/ruby/gherkin.berp deleted file mode 100644 index a1f7ecda3..000000000 --- a/ruby/gherkin.berp +++ /dev/null @@ -1,38 +0,0 @@ -[ - Tokens -> #Empty,#Comment,#TagLine,#FeatureLine,#RuleLine,#BackgroundLine,#ScenarioLine,#ExamplesLine,#StepLine,#DocStringSeparator,#TableRow,#Language - IgnoredTokens -> #Comment,#Empty - ClassName -> Parser - Namespace -> Gherkin -] - -GherkinDocument! := Feature? -Feature! := FeatureHeader Background? ScenarioDefinition* Rule* -FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - -Rule! := RuleHeader Background? ScenarioDefinition* -RuleHeader! := Tags? #RuleLine DescriptionHelper - -Background! := #BackgroundLine DescriptionHelper Step* - -// Interpreting a tag line is ambiguous (tag line of rule or of scenario) -ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine]:= Tags? Scenario - -Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* -// after the first "Data" block, interpreting a tag line is ambiguous (tagline of next examples or of next scenario) -// because of this, we need a lookahead hint, that connects the tag line to the next examples, if there is an examples block ahead -ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine]:= Tags? Examples -Examples! := #ExamplesLine DescriptionHelper ExamplesTable? -ExamplesTable! := #TableRow #TableRow* - -Step! := #StepLine StepArg? -StepArg := (DataTable | DocString) - -DataTable! := #TableRow+ -DocString! := #DocStringSeparator #Other* #DocStringSeparator - -Tags! := #TagLine+ - -// we need to explicitly mention comment, to avoid merging it into the description line's #Other token -// we also eat the leading empty lines, the tailing lines are not removed by the parser to avoid lookahead, this has to be done by the AST builder -DescriptionHelper := #Empty* Description? #Comment* -Description! := #Other+ diff --git a/ruby/scripts/update-gemspec b/ruby/scripts/update-gemspec deleted file mode 100755 index d45401fd5..000000000 --- a/ruby/scripts/update-gemspec +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash -# -# Updates the *.gemspec in the current directory to use the latest releases of gems -# -set -uf -o pipefail -IFS=$'\n' - -gemspec=$(find . -maxdepth 1 -type f -name "*.gemspec") -if [ "${gemspec}" = "" ]; then - exit 0 -fi -add_dependency_lines=$(cat ${gemspec} | grep "s.add_[a-z_]*dependency '[^']*'") -if [ $? -ne 0 ]; then - # No add_dependency_lines found - nothing to do - exit 0 -fi - -set -e - -gems=$(echo "${add_dependency_lines}" | tr -s ' ' | cut -d ' ' -f3 | cut -d"'" -f 2) -while read -r gem; do - echo "upgrading ${gem}" - if [ "${gem}" = "bundler" ]; then - cat "${gemspec}" | sed "s/\(s.add_[a-z_]*dependency\) '${gem}'.*/\1 '${gem}', '>= 1.16.2'/" > ${gemspec}.tmp - else - gem_line=$(gem list "${gem}" --remote --all --no-prerelease | grep "^${gem}\s") - latest_patch_version=$(echo "${gem_line}" | cut -d'(' -f2 | cut -d')' -f1 | cut -d',' -f1 | cut -d' ' -f1) - latest_minor_version=$(echo "${latest_patch_version}" | cut -d. -f1,2) - cat "${gemspec}" | sed "s/\(s.add_[a-z_]*dependency\) '${gem}'.*/\1 '${gem}', '~> ${latest_minor_version}', '>= ${latest_patch_version}'/" > ${gemspec}.tmp - fi - mv ${gemspec}.tmp ${gemspec} -done <<< "${gems}"