Browse Source

init

master
youys 2 years ago
commit
d6f1e83ddd
100 changed files with 5743 additions and 0 deletions
  1. +3
    -0
      .cucumberproignore
  2. +32
    -0
      .gitattributes
  3. +37
    -0
      .gitignore
  4. +2
    -0
      .rspec
  5. +158
    -0
      .rubocop.yml
  6. +89
    -0
      .rubocop_todo.yml
  7. +1
    -0
      .ruby-gemset
  8. +3394
    -0
      CHANGELOG.md
  9. +246
    -0
      CONTRIBUTING.md
  10. +15
    -0
      Gemfile
  11. +22
    -0
      LICENSE
  12. +62
    -0
      Makefile
  13. +162
    -0
      README.md
  14. +34
    -0
      RELEASING.md
  15. +22
    -0
      Rakefile
  16. +180
    -0
      UPGRADING.md
  17. +1
    -0
      VERSION
  18. +9
    -0
      bin/cucumber
  19. +29
    -0
      bin/rspec
  20. +63
    -0
      cucumber.gemspec
  21. +18
    -0
      cucumber.yml
  22. +40
    -0
      docs/jruby-limitations.md
  23. +94
    -0
      docs/vscode-example-launch-configuration.md
  24. +3
    -0
      examples/i18n/README.textile
  25. +50
    -0
      examples/i18n/Rakefile
  26. +6
    -0
      examples/i18n/ar/Rakefile
  27. +17
    -0
      examples/i18n/ar/features/addition.feature
  28. +21
    -0
      examples/i18n/ar/features/step_definitions/calculator_steps.rb
  29. +10
    -0
      examples/i18n/ar/lib/calculator.rb
  30. +6
    -0
      examples/i18n/bg/Rakefile
  31. +12
    -0
      examples/i18n/bg/features/addition.feature
  32. +19
    -0
      examples/i18n/bg/features/consecutive_calculations.feature
  33. +17
    -0
      examples/i18n/bg/features/division.feature
  34. +25
    -0
      examples/i18n/bg/features/step_definitions/calculator_steps.rb
  35. +9
    -0
      examples/i18n/bg/features/support/env.rb
  36. +7
    -0
      examples/i18n/bg/features/support/world.rb
  37. +27
    -0
      examples/i18n/bg/lib/calculator.rb
  38. +6
    -0
      examples/i18n/ca/Rakefile
  39. +18
    -0
      examples/i18n/ca/features/step_definitions/calculator_steps.rb
  40. +17
    -0
      examples/i18n/ca/features/suma.feature
  41. +14
    -0
      examples/i18n/ca/lib/calculadora.rb
  42. +1
    -0
      examples/i18n/cs/.gitignore
  43. +6
    -0
      examples/i18n/cs/Rakefile
  44. +17
    -0
      examples/i18n/cs/features/addition.feature
  45. +11
    -0
      examples/i18n/cs/features/division.feature
  46. +18
    -0
      examples/i18n/cs/features/step_definitions/calculator_steps.rb
  47. +14
    -0
      examples/i18n/cs/lib/calculator.rb
  48. +6
    -0
      examples/i18n/da/Rakefile
  49. +18
    -0
      examples/i18n/da/features/sammenlaegning.feature
  50. +28
    -0
      examples/i18n/da/features/step_definitions/lommeregner_steps.rb
  51. +10
    -0
      examples/i18n/da/lib/lommeregner.rb
  52. +1
    -0
      examples/i18n/de/.gitignore
  53. +6
    -0
      examples/i18n/de/Rakefile
  54. +17
    -0
      examples/i18n/de/features/addition.feature
  55. +10
    -0
      examples/i18n/de/features/division.feature
  56. +28
    -0
      examples/i18n/de/features/step_definitions/calculator_steps.rb
  57. +14
    -0
      examples/i18n/de/lib/calculator.rb
  58. +1
    -0
      examples/i18n/el/.gitignore
  59. +6
    -0
      examples/i18n/el/Rakefile
  60. +17
    -0
      examples/i18n/el/features/addition.feature
  61. +10
    -0
      examples/i18n/el/features/division.feature
  62. +25
    -0
      examples/i18n/el/features/step_definitions/calculator_steps.rb
  63. +14
    -0
      examples/i18n/el/lib/calculator.rb
  64. +4
    -0
      examples/i18n/en-lol/Rakefile
  65. +16
    -0
      examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb
  66. +8
    -0
      examples/i18n/en-lol/features/stuffing.feature
  67. +10
    -0
      examples/i18n/en-lol/features/support/env.rb
  68. +12
    -0
      examples/i18n/en-lol/lib/basket.rb
  69. +11
    -0
      examples/i18n/en-lol/lib/belly.rb
  70. +1
    -0
      examples/i18n/en/.gitignore
  71. +6
    -0
      examples/i18n/en/Rakefile
  72. +17
    -0
      examples/i18n/en/features/addition.feature
  73. +10
    -0
      examples/i18n/en/features/division.feature
  74. +21
    -0
      examples/i18n/en/features/step_definitions/calculator_steps.rb
  75. +14
    -0
      examples/i18n/en/lib/calculator.rb
  76. +1
    -0
      examples/i18n/eo/.gitignore
  77. +6
    -0
      examples/i18n/eo/Rakefile
  78. +17
    -0
      examples/i18n/eo/features/adicio.feature
  79. +10
    -0
      examples/i18n/eo/features/divido.feature
  80. +21
    -0
      examples/i18n/eo/features/step_definitions/calculator_steps.rb
  81. +14
    -0
      examples/i18n/eo/lib/calculator.rb
  82. +6
    -0
      examples/i18n/es/Rakefile
  83. +17
    -0
      examples/i18n/es/features/adicion.feature
  84. +18
    -0
      examples/i18n/es/features/step_definitions/calculador_steps.rb
  85. +14
    -0
      examples/i18n/es/lib/calculador.rb
  86. +6
    -0
      examples/i18n/et/Rakefile
  87. +10
    -0
      examples/i18n/et/features/jagamine.feature
  88. +17
    -0
      examples/i18n/et/features/liitmine.feature
  89. +21
    -0
      examples/i18n/et/features/step_definitions/kalkulaator_steps.rb
  90. +14
    -0
      examples/i18n/et/lib/kalkulaator.rb
  91. +1
    -0
      examples/i18n/fi/.gitignore
  92. +6
    -0
      examples/i18n/fi/Rakefile
  93. +10
    -0
      examples/i18n/fi/features/jakolasku.feature
  94. +28
    -0
      examples/i18n/fi/features/step_definitions/laskin_steps.rb
  95. +17
    -0
      examples/i18n/fi/features/yhteenlasku.feature
  96. +14
    -0
      examples/i18n/fi/lib/laskin.rb
  97. +8
    -0
      examples/i18n/fr/Rakefile
  98. +18
    -0
      examples/i18n/fr/features/addition.feature
  99. +17
    -0
      examples/i18n/fr/features/addition2.feature
  100. +27
    -0
      examples/i18n/fr/features/step_definitions/calculatrice_steps.rb

+ 3
- 0
.cucumberproignore View File

@@ -0,0 +1,3 @@
.github
/examples
/spec

+ 32
- 0
.gitattributes View File

@@ -0,0 +1,32 @@
# Set the default behavior, in case people don't have core.autocrlf set.
* text eol=lf

# Explicitly declare text files to always be normalized and converted
# to native line endings on checkout.
*.css text eol=lf
*.feature text eol=lf
*.gemspec text eol=lf
*.js text eol=lf
*.md text eol=lf
*.rake text eol=lf
*.rb text eol=lf
*.sass text eol=lf
*.tcl text eol=lf
*.textile text eol=lf
*.txt text eol=lf
*.xml text eol=lf
*.yml text eol=lf
Gemfile text eol=lf
LICENSE text eol=lf
Rakefile text eol=lf
.cucumberproignore text eol=lf
.gitignore text eol=lf
.rspec text eol=lf
.ruby-gemset text eol=lf
.yardopts text eol=lf
scripts/* text eol=lf

# Denote all files that are truly binary and should not be modified.
# These patterns are here as an example; we have 0 of these.
*.png binary
*.jpg binary

+ 37
- 0
.gitignore View File

@@ -0,0 +1,37 @@
.bundle
nbproject
coverage
pkg
doc
tmp
.yardoc
*.log
*.pid
.eprj
.tmtags
*~
.DS_Store
*.swp
*.swo
target
*.tmproj
.#*
.idea
.vscode
*.pyc
*.rbc
rerun.txt
._*
.rvmrc
.sass-cache
doc/
*.tgz
tags
.ruby-version
.project
Gemfile.local
Gemfile.local.lock
.envrc
Gemfile.lock
bin/json-formatter
acceptance/*

+ 2
- 0
.rspec View File

@@ -0,0 +1,2 @@
--color
--tag "~cck"

+ 158
- 0
.rubocop.yml View File

@@ -0,0 +1,158 @@
inherit_from: .rubocop_todo.yml

require:
- rubocop-packaging

AllCops:
NewCops: disable
# Keep this inline with the lowest ruby-* version in circleci/config.yml and
# the version in the gemspec
TargetRubyVersion: 2.6
# Cop names are not displayed in offense messages by default. Change behavior
# by overriding DisplayCopNames, or by giving the `-D/--display-cop-names`
# option.
DisplayCopNames: true
# Style guide URLs are not displayed in offense messages by default. Change
# behavior by overriding `DisplayStyleGuide`, or by giving the
# `-S/--display-style-guide` option.
DisplayStyleGuide: true
Exclude:
- 'bin/*'
- 'tmp/**/*'
- 'vendor/**/*'
- 'temp_app/**/*'
- 'cck/features/**/*'

Layout/EndOfLine:
EnforcedStyle: lf

# Disabling this cop until the minimum Ruby version is >= 2.3 as squiggly
# heredocs '<<~' were introduced then. The files below are the current ones
# with offenses
Layout/HeredocIndentation:
Exclude:
- 'features/lib/support/feature_factory.rb'
- 'lib/cucumber/cli/options.rb'
- 'lib/cucumber/cli/profile_loader.rb'
- 'spec/cucumber/cli/configuration_spec.rb'
- 'spec/cucumber/cli/profile_loader_spec.rb'
- 'spec/cucumber/formatter/pretty_spec.rb'

# Reviewed: Formatters put trailing spaces after things like 'Feature: '
# In pretty_spec.rb, progress_spec.rb offences look false,
# as the trailing spaces are in multiline string literals
Layout/TrailingWhitespace:
Exclude:
- 'spec/cucumber/formatter/pretty_spec.rb'
- 'spec/cucumber/formatter/progress_spec.rb'

# Reviewed: please see PR-1022 for details on why this cop is disabled:
# https://github.com/cucumber/cucumber-ruby/pull/1022
Lint/AmbiguousOperator:
Enabled: false

# We exclude proto_world for documentation (rdoc) purpose
Lint/UselessMethodDefinition:
Enabled: true
Exclude:
- 'lib/cucumber/glue/proto_world.rb'

Metrics/AbcSize:
Max: 45

Metrics/BlockLength:
CountComments: false
Exclude:
- './cucumber.gemspec'
- './spec/**/*'
- 'cck/spec/**/*'

Metrics/ClassLength:
Max: 375
Exclude:
- 'lib/cucumber/cli/options.rb'

Metrics/CyclomaticComplexity:
Max: 12

# A line length of 200 covers most violations in the repo while still being
# a more up to date length given today's screen sizes
Layout/LineLength:
Max: 200

Metrics/ModuleLength:
Max: 150
Exclude:
- './spec/**/*'
- 'cck/spec/**/*'

Metrics/MethodLength:
Max: 30

Metrics/PerceivedComplexity:
Max: 13

# Rubocop doesn't like method names in other languages but as Cucumber supports
# languages, this cop needs to be disabled.
Naming/AsciiIdentifiers:
Enabled: false

# For the most part, the project is solid on naming. There are though, a few
# cases where the cop doesn't need to catch.
Naming/MethodName:
EnforcedStyle: snake_case
Enabled: true
Exclude:
- 'examples/i18n/ar/lib/calculator.rb'
- 'examples/i18n/he/lib/calculator.rb'
- 'examples/i18n/he/lib/calculator.rb'
- 'examples/i18n/tr/lib/hesap_makinesi.rb'
- 'lib/cucumber/glue/dsl.rb'

# In most cases, being descriptive with parameter names helps a reader understand
# what the variable is for. In some cases, shorter names are sufficient.
Naming/MethodParameterName:
AllowedNames: _, e, n, v, id, io, gh, pr

# Reviewed: these offenses look false as the variables are in cyrillic
Naming/VariableName:
Exclude:
- 'examples/i18n/ru/features/step_definitions/calculator_steps.rb'
- 'examples/i18n/uk/features/step_definitions/calculator_steps.rb'
- 'examples/i18n/uz/features/step_definitions/calculator_steps.rb'

# Rubocop doesn't handle some international words well for this cop
Naming/VariableNumber:
EnforcedStyle: normalcase
Exclude:
- 'examples/i18n/**/*'

# This cop throws errors when parsing a lot of the repo's code, possibly due
# to splat issues?
Style/AccessModifierDeclarations:
Enabled: false

Style/ClassAndModuleChildren:
Enabled: false

Style/ClassEqualityComparison:
Enabled: true

Style/Documentation:
Enabled: false

Style/FormatStringToken:
EnforcedStyle: annotated

Style/FloatDivision:
Enabled: false

Style/StderrPuts:
Enabled: false

Style/RegexpLiteral:
EnforcedStyle: slashes
AllowInnerSlashes: true

Style/YodaCondition:
Enabled: true

+ 89
- 0
.rubocop_todo.yml View File

@@ -0,0 +1,89 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2020-08-23 16:54:14 UTC using RuboCop version 0.89.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.

# Offense count: 38
# Cop supports --auto-correct.
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
# SupportedHashRocketStyles: key, separator, table
# SupportedColonStyles: key, separator, table
# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
Layout/HashAlignment:
Exclude:
- 'cucumber.gemspec'
- 'lib/cucumber/cli/options.rb'
- 'lib/cucumber/formatter/ansicolor.rb'
- 'lib/cucumber/gherkin/formatter/ansi_escapes.rb'

# Offense count: 5
# Cop supports --auto-correct.
Lint/RedundantCopDisableDirective:
Exclude:
- 'lib/cucumber/errors.rb'
- 'lib/cucumber/glue/proto_world.rb'
- 'lib/cucumber/glue/registry_and_more.rb'
- 'lib/cucumber/glue/snippet.rb'

# Offense count: 1
# Configuration parameters: AllowComments.
Lint/SuppressedException:
Exclude:
- 'lib/cucumber/rake/task.rb'

# Offense count: 1
# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, Regex, IgnoreExecutableScripts, AllowedAcronyms.
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
Naming/FileName:
Exclude:
- 'features/lib/step_definitions/iso-8859-1_steps.rb'

# Offense count: 197
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: always, always_true, never
Style/FrozenStringLiteralComment:
Enabled: false

# Offense count: 5
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: literals, strict
Style/MutableConstant:
Exclude:
- 'lib/cucumber/cli/options.rb'
- 'lib/cucumber/file_specs.rb'
- 'lib/cucumber/runtime.rb'
- 'lib/cucumber/term/ansicolor.rb'

# Offense count: 5
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods.
# SupportedStyles: predicate, comparison
Style/NumericPredicate:
Exclude:
- 'spec/**/*'
- 'lib/cucumber/formatter/console.rb'
- 'lib/cucumber/formatter/console_counts.rb'
- 'lib/cucumber/glue/invoke_in_world.rb'
- 'lib/cucumber/runtime.rb'

# Offense count: 10
# Cop supports --auto-correct.
Style/RedundantFreeze:
Exclude:
- 'lib/cucumber/cli/options.rb'
- 'lib/cucumber/formatter/unicode.rb'
- 'spec/cucumber/step_match_spec.rb'

# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods.
# AllowedMethods: present?, blank?, presence, try, try!
Style/SafeNavigation:
Exclude:
- 'lib/cucumber/formatter/ansicolor.rb'
- 'lib/cucumber/gherkin/formatter/ansi_escapes.rb'

+ 1
- 0
.ruby-gemset View File

@@ -0,0 +1 @@
cucumber

+ 3394
- 0
CHANGELOG.md
File diff suppressed because it is too large
View File


+ 246
- 0
CONTRIBUTING.md View File

@@ -0,0 +1,246 @@
# Contributing to Cucumber

Thank you for considering contributing to Cucumber!

This document will first introduce different ways to get involved before
focusing on how to contribute to the code.

## Code of Conduct

Everyone interacting in this codebase and issue tracker is expected to follow
the Cucumber [code of conduct](https://cucumber.io/conduct).

## How can I contribute?

If you're reading this, you are certainly looking to contribute to the code. Cucumber
is not this single repository. It is made up of several packages around several
repositories. So before going further with the code, you may consider the
following first, in order to get your bearings.

If you just want to know how to contribute to the code, go to
[Contribute to the code](#contribute-to-the-code).

If you want to report an issue, or suggest an enhancement, go to
[Report bugs and submit feature requests](#report-bugs-and-submit-feature-requests).

### Meet the community, the maintainers, and other Cucumber developers

Smartbear hosts a [community message board].
This is a good place to meet users, the community, and to ask questions.

You can also join the Cucumber Community Slack:
[register for an account][register-slack] then head over to [#intro][slack-intro].
This is the place to be to meet other contributors and find a mentor to help you
get started.

### Test Cucumber

Testing Cucumber, especially new features, is a great way to contribute. We
cannot put a price on (early) feedback.

Keep an eye on our CHANGELOGS to discover new features. Test and experiment, and
submit your feedback through [issues](#report-bugs-and-submit-feature-requests),
the [community message board], or [Slack][community-slack].

### Contribute to the documentation

[The documentation][cucumber-docs] is an important part of Cucumber. It is
essential that it remains simple and accurate. You can contribute to it via
[github.com/cucumber/docs](https://github.com/cucumber/docs).

### Promote Cucumber

You don't know how to contribute but would like to help? Telling other people
about Cucumber on the Internet - social media, reviews, blogs - but also in real
life is already a big help! Join us on [Slack][community-slack] to share your
publication and to discover new ones.

## Report bugs and submit feature requests

The short version is:

- Find the appropriate repository
- Try to check there is not already an issue or pull request that deals with
your bug or request
- Explain your issue and include as much details as possible to help other
people reproduce your problem or understand your request
- Consider submitting a pull request if you feel confident enough

You can find more details for each of these steps in the following sections.

### Find the appropriate repository

The current repository, `cucumber-ruby`, is actually the tip of the iceberg. It
provides a user interface through a CLI, some built-in formatters, and the
execution environment you may know as the `World` object.

An important repository is [cucumber/common]. It is a mono-repo
with a lot of libraries. You will find there what is related to:

- parsing Gherkin documents - aka `.feature` files
- parsing tag expressions - the options you use to filter an execution with tags
- parsing Cucumber expressions - the expressions that link a Gherkin step to a
step definition
- everyting related to the HTML formatter

`cucumber-ruby` is also composed of [cucumber-ruby-core]: this is the engine that
will execute the test cases computed from a parsed Gherkin document

Last but not least, there is also a repository for [cucumber-rails], the gem
that brings Cucumber to Rails 5.x and 6.x.

In any case, if your are not sure, best places to open an issue are the current
repository - `cucumber-ruby` - and the mono-repo at [cucumber/common].

### Look for existing issues and pull requests

Search in [the current repository][cucumber-ruby-issues], in the
[mono-repo][cucumber/common-issues], but also in the
[whole cucumber organization][cucumber-issues] if the problem or feature has already
been reported. If you find an issue or pull request which is still open, add
comments to it instead of opening a new one.

If you're not sure, don't hesitate to just open a new issue. We can always merge
and de-duplicate later.

### Submitting a pull request

When submitting a pull request:

- create a [draft pull request][how-to-create-a-draft-pr]
- try to follow the instructions in the [template](.github/PULL_REQUEST_TEMPLATE.md)
- if possible, [sign your commits]
- update CHANGELOG.md with your changes
- once the PR is ready, request for reviews

More info on [how to contribute to the code](#contribute-to-the-code) can be
found below.

### Opening a new issue

To open a good issue, be clear and precise.

If you report a problem, the reader must be able to reproduce it easily.
Please do your best to create a [minimal, reproducible example][minimal-reproducible-example].

Consider submitting a pull request. Even if you think you cannot fix it by
yourself, a pull request with a failing test is always welcome.

If you request is for an enhancement - a new feature - try to be specific and
support your request with referenced facts and include examples to illustrate
your proposal.

## Contribute to the code

### Development environment

Development environment for `cucumber-ruby` is a simple Ruby environment with
Bundler. Use a [supported Ruby version](./README.md#supported-platforms), make
sure [Bundler] is set-up, and voilà!

You can then [fork][how-to-fork] and clone the repository. If your environment
is set-up properly, the following commands should install the dependencies and
execute all the tests successfully.

```shell
bundle install
bundle exec rake
```

You can now create a branch for your changes and [submit a pull request](#submitting-a-pull-request)!

If you want to check the code coverage during your development, execute
`bundle exec rake cov`.

### Cucumber-ruby-core

As seen here: [Find the appropriate repository](#find-the-appropriate-repository),
you may need to work with other repositories in order to accomplish your
development. Beside the mono-repo in [cucumber/common], [cucumber-ruby-core] is
also a big piece of `cucumber-ruby`.

### Using a local Gemfile

A local Gemfile allows you to use your prefer set of gems for your own
development workflow, like gems dedicated to debugging. Such gems are not part
of `cucumber-ruby` standard `Gemfile`.

`Gemfile.local`, `Gemfile.local.lock` and `.bundle` have been added to
`.gitignore` so local changes cannot be accidentaly commited and pushed to the
repository.

A `Gemfile.local` may look like this:

```ruby
# Gemfile.local

# Include the regular Gemfile
eval File.read('Gemfile')

# Include your favorites development gems
group :development do
gem 'byebug'
gem 'pry'
gem 'pry-byebug'

gem 'debase', require: false
gem 'ruby-debug-ide', require: false
end
```

Then you can execute bundler with the `--gemfile` flag:
`bundle install --gemfile Gemfile.local`, or with an environment variable:
`BUNDLE_GEMFILE=Gemfile.local bundle [COMMAND]`.

To use your local Gemfile per default, you can also execute
`bundle config set --local gemfile Gemfile.local`.

### First timer? Welcome!

Looking for something simple to begin with? Look at issues with the label
'[good first issue](https://github.com/cucumber/cucumber-ruby/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)'.

Remember: Cucumber is more than `cucumber-ruby`. You can look for good first
issues in [other cucumber reporistories](#find-the-appropriate-repository).

### Having trouble getting started with the code? We're here to help!

If you have trouble setting-up your development environment, or getting started
with the code, you can join us on [Slack][community-slack]. You will find there
a lot of contributors.

Full-time maintainers are also available. We would be please to have 1:1 pairing
sessions to help you getting started. Look for
[Matt Wynne](https://cucumberbdd.slack.com/team/U590XDLF3) or
[Aurélien Reeves](https://cucumberbdd.slack.com/team/U011BB95MC7) on
[Slack][community-slack].

### Additional documentation and notice

You can find additional documentation in the [docs](./docs) directory such as
(non-exhaustive list):

- [How to release cucumber-ruby](./docs/RELEASE_PROCESS.md) (for maintainers)
- [How to set-up a launch.json configuration for Visual Studio Code](./docs/vscode-example-launch-configuration.md)


<!-- Links -->

[community message board]: https://community.smartbear.com/t5/Cucumber-Open/bd-p/CucumberOS
[register-slack]: https://cucumberbdd-slack-invite.herokuapp.com/
[slack-intro]: https://cucumberbdd.slack.com/messages/C5WD8SA21/
[community-slack]: https://cucumberbdd.slack.com/
[cucumber-docs]: https://cucumber.io/docs/cucumber
[cucumber/common]: https://github.com/cucumber/common
[cucumber-ruby-core]: https://github.com/cucumber/cucumber-ruby-core
[cucumber-rails]: https://github.com/cucumber/cucumber-rails
[cucumber-ruby-issues]: https://github.com/cucumber/cucumber-ruby/search?q=is%3Aissue
[cucumber/common-issues]: https://github.com/cucumber/common/search?q=is%3Aissue
[cucumber-issues]: https://github.com/search?q=is%3Aissue+user%3Acucumber
[how-to-create-a-draft-pr]: https://docs.github.com/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests
[how-to-fork]: https://docs.github.com/github/collaborating-with-pull-requests/working-with-forks/about-forks
[sign your commits]: https://docs.github.com/en/github/authenticating-to-github/managing-commit-signature-verification/signing-commits
[minimal-reproducible-example]: https://stackoverflow.com/help/minimal-reproducible-example
[RVM]: https://rvm.io/
[rbenv]: https://github.com/rbenv/rbenv
[Bundler]: https://bundler.io/

+ 15
- 0
Gemfile View File

@@ -0,0 +1,15 @@
source 'https://rubygems.org'

git_source(:github) { |repo| "https://github.com/#{repo}.git" }

gemspec

gem 'rubocop', '1.43.0'
gem 'rubocop-packaging', '0.5.2'

# To hack on Cucumber together with any of these libraries, uncomment the line below:
# gem 'cucumber-core', path: '../cucumber-ruby-core'
# gem 'cucumber-cucumber-expressions', path: '../cucumber-expressions/ruby'
# gem 'cucumber-gherkin', path: '../common/gherkin/ruby'
# gem 'cucumber-html-formatter', path: '../html-formatter/ruby'
# gem 'cucumber-messages', path: '../common/messages/ruby'

+ 22
- 0
LICENSE View File

@@ -0,0 +1,22 @@
The MIT License

Copyright (c) Aslak Hellesøy

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.

+ 62
- 0
Makefile View File

@@ -0,0 +1,62 @@
MONOREPO_PATH ?= ../../cucumber

# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make
rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d))
RUBY_FILES=$(call rwildcard,../lib ../../cucumber-ruby-core/lib/,*.rb)

FEATURES = $(sort $(wildcard features/docs/**.feature))
GOLDEN_JSONS = $(patsubst features/docs/%.feature,acceptance/%-golden.json,$(FEATURES))
GENERATED_JSONS = $(patsubst features/docs/%.feature,acceptance/%-generated.json,$(FEATURES))
TESTED = $(patsubst features/docs/%.feature,acceptance/%.tested,$(FEATURES))

OS := $(shell [[ "$$(uname)" == "Darwin" ]] && echo "darwin" || echo "linux")
# Determine if we're on 386 or amd64 (ignoring other processors as we're not building on them)
ARCH := $(shell [[ "$$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "386")

default: $(GOLDEN_JSONS) $(GENERATED_JSONS) $(TESTED)
.PHONY: default

acceptance/%.tested: acceptance/%-golden.json acceptance/%-generated.json
mkdir -p $$(dirname $@)
diff --unified $^
.PHONY: acceptance/%.tested

acceptance/%-golden.json: features/docs/%.feature $(MONOREPO_PATH)/compatibility-kit/ruby/scripts/neutralize-json $(RUBY_FILES)
mkdir -p $$(dirname $@)
bundle exec cucumber --format=json $< | \
jq --sort-keys "." | \
$(MONOREPO_PATH)/compatibility-kit/ruby/scripts/neutralize-json > $@

acceptance/%-generated.json: features/docs/%.feature $(RUBY_FILES) bin/json-formatter $(MONOREPO_PATH)/compatibility-kit/ruby/scripts/neutralize-json
mkdir -p $$(dirname $@)
bundle exec cucumber --format=message $< | \
bin/json-formatter --format ndjson | \
jq --sort-keys "." | \
$(MONOREPO_PATH)/compatibility-kit/ruby/scripts/neutralize-json > $@

bin/json-formatter: $(MONOREPO_PATH)/json-formatter/go/dist/cucumber-json-formatter-$(OS)-$(ARCH)
cp $(MONOREPO_PATH)/json-formatter/go/dist/cucumber-json-formatter-$(OS)-$(ARCH) $@
chmod +x $@

clean:
rm -rf acceptance/*.json bin/json-formatter
.PHONY: clean

release:
[ -d '../secrets' ] || git clone keybase://team/cucumberbdd/secrets ../secrets
git -C ../secrets pull
../secrets/update_permissions
docker run \
--volume "${shell pwd}":/app \
--volume "${shell pwd}/../secrets/import-gpg-key.sh":/home/cukebot/import-gpg-key.sh \
--volume "${shell pwd}/../secrets/codesigning.key":/home/cukebot/codesigning.key \
--volume "${shell pwd}/../secrets/.ssh":/home/cukebot/.ssh \
--volume "${shell pwd}/../secrets/.gem":/home/cukebot/.gem \
--volume "${HOME}/.gitconfig":/home/cukebot/.gitconfig \
--env CUCUMBER_USE_RELEASED_GEMS=1 \
--env-file ../secrets/secrets.list \
--user 1000 \
--rm \
-it cucumber/cucumber-build:latest \
bash -c "rm Gemfile.lock && bundle && bundle exec rake && bundle exec rake release"
.PHONY: release

+ 162
- 0
README.md View File

@@ -0,0 +1,162 @@
<p align="center">
<img src="./.github/img/cucumber-open-logo.png" alt="Cucumber Open - Supported by Smartbear" width="428" />
</p>

# Cucumber

[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://vshymanskyy.github.io/StandWithUkraine)
[![OpenCollective](https://opencollective.com/cucumber/backers/badge.svg)](https://opencollective.com/cucumber)
[![OpenCollective](https://opencollective.com/cucumber/sponsors/badge.svg)](https://opencollective.com/cucumber)
[![pull requests](https://oselvar.com/api/badge?label=pull%20requests&csvUrl=https%3A%2F%2Fraw.githubusercontent.com%2Fcucumber%2Foselvar-github-metrics%2Fmain%2Fdata%2Fcucumber%2Fcucumber-ruby%2FpullRequests.csv)](https://oselvar.com/github/cucumber/oselvar-github-metrics/main/cucumber/cucumber-ruby)
[![issues](https://oselvar.com/api/badge?label=issues&csvUrl=https%3A%2F%2Fraw.githubusercontent.com%2Fcucumber%2Foselvar-github-metrics%2Fmain%2Fdata%2Fcucumber%2Fcucumber-ruby%2Fissues.csv)](https://oselvar.com/github/cucumber/oselvar-github-metrics/main/cucumber/cucumber-ruby)
[![Test cucumber](https://github.com/cucumber/cucumber-ruby/actions/workflows/cucumber-ruby.yml/badge.svg)](https://github.com/cucumber/cucumber-ruby/actions/workflows/cucumber-ruby.yml)
[![Code Climate](https://codeclimate.com/github/cucumber/cucumber-ruby.svg)](https://codeclimate.com/github/cucumber/cucumber-ruby)
[![Coverage Status](https://coveralls.io/repos/cucumber/cucumber-ruby/badge.svg?branch=main)](https://coveralls.io/r/cucumber/cucumber-ruby?branch=main)

Cucumber is a tool for running automated tests written in plain language. Because they're
written in plain language, they can be read by anyone on your team. Because they can be
read by anyone, you can use them to help improve communication, collaboration and trust on
your team.

<p align="center">
<img src="./.github/img/gherkin-example.png" alt="Cucumber Gherkin Example" width="728" />
</p>

This is the Ruby implementation of Cucumber. Cucumber is also available for [JavaScript](https://github.com/cucumber/cucumber-js),
[Java](https://github.com/cucumber/cucumber-jvm), and a lot of other languages. You can find a list of implementations here: https://cucumber.io/docs/installation/.

See [CONTRIBUTING.md](CONTRIBUTING.md) for info on contributing to Cucumber (issues, PRs, etc.).

Everyone interacting in this codebase and issue tracker is expected to follow the
Cucumber [code of conduct](https://cucumber.io/conduct).

## Installation

Cucumber for Ruby is a Ruby gem. Install it as you would install any gem: add
`cucumber` to your Gemfile:

gem 'cucumber'

then install it:

$ bundle

or install the gem directly:

$ gem install cucumber

Later in this document, bundler is considered being used so all commands are using
`bundle exec`. If this is not the case for you, execute `cucumber` directly, without
`bundle exec`.

### Supported platforms

- Ruby 3.2
- Ruby 3.1
- Ruby 3.0
- Ruby 2.7
- Ruby 2.6
- TruffleRuby 22.0.0+
- JRuby (with [some limitations](https://github.com/cucumber/cucumber-ruby/blob/main/docs/jruby-limitations.md))
- 9.3 >= 9.3.1 (there is a known issue with JRuby 9.3.0. More info can
be found in the [PR#1571](https://github.com/cucumber/cucumber-ruby/pull/1571).)

### Ruby on Rails

Using Ruby on Rails? You can use [cucumber-rails](https://github.com/cucumber/cucumber-rails)
to bring Cucumber into your Rails project.

## Usage

### Initialization

If you need to, initialize your `features` directory with

$ bundle exec cucumber --init

This will create the following directories and files if they do not exist already:

features
├── step_definitions
└── support
└── env.rb

### Create your specification

Create a file named `rule.feature` in the `features` directory with:

```gherkin
# features/rule.feature

Feature: Rule Sample

Rule: This is a rule

Example: A passing example
Given this will pass
When I do an action
Then some results should be there

Example: A failing example
Given this will fail
When I do an action
Then some results should be there

```

### Automate your specification

And a file named `steps.rb` in `features/step_definitions` with:

```ruby
# features/step_definitions/steps.rb

Given("this will pass") do
@this_will_pass = true
end

Given("this will fail") do
@this_will_pass = false
end

When("I do an action") do
end

Then("some results should be there") do
expect(@this_will_pass)
end
```

### Run Cucumber

$ bundle exec cucumber

To execute a single feature file:

$ bundle exec cucumber features/rule.feature

To execute a single example, indicates the line of the name of the example:

$ bundle exec cucumber features/rule.feature:7

To summarize the results on the standard output, and writte a HTML report on disk:

$ bundle exec cucumber --format summary --format html --out report.html

For more command line options

$ bundle exec cucumber --help

You can also find documentation on the command line possibilities in
[features/docs/cli](features/docs/cli).

## Documentation and support

- Getting started, writing features, step definitions, and more: https://cucumber.io/docs
- Ruby API Documentation: http://www.rubydoc.info/github/cucumber/cucumber-ruby/
- Community support forum: https://community.smartbear.com/t5/Cucumber-Open/bd-p/CucumberOS
- Slack: [register for an account](https://cucumberbdd-slack-invite.herokuapp.com/) then head over to [#intro](https://cucumberbdd.slack.com/messages/C5WD8SA21/)

## Copyright

Copyright (c) Cucumber Ltd. and Contributors. See LICENSE for details.

+ 34
- 0
RELEASING.md View File

@@ -0,0 +1,34 @@
# Release process for cucumber-ruby

## Prerequisites

To release `cucumber-ruby`, you'll need:

- to be a member of the core-team
- make
- docker

## cucumber-ruby-core

If internal libraries such as `cucumber-gherkin` needs to be updated, you'll
need to update and release `cucumber-ruby-core` before releasing `cucumber-ruby`.

## Releasing cucumber-ruby

- Upgrade gems with `scripts/update-gemspec`
- Bump the version number in `lib/cucumber/version`
- Update `CHANGELOG.md` with the upcoming version number and create a new `Unreleased` section
- Remove empty sections from `CHANGELOG.md`
- Commit the changes using a verified signature
```shell
git commit --gpg-sign -am "Release X.Y.Z"
git push
```
- Now release it: push to a dedicated `release/` branch:
```shell
git push origin main:release/vX.Y.Z
```
- Check the release has been successfully pushed to [rubygems](https://rubygems.org/gems/cucumber)
- Finally, update the `cucumber-ruby` version in the
[documentation project](https://cucumber.io/docs/installation/) in
[versions.yaml](https://github.com/cucumber/docs/blob/master/data/versions.yaml).

+ 22
- 0
Rakefile View File

@@ -0,0 +1,22 @@
require 'rubygems'
require 'bundler'

Bundler::GemHelper.install_tasks

$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib")
Dir['gem_tasks/**/*.rake'].each { |rake| load rake }

require 'rubocop/rake_task'
RuboCop::RakeTask.new

require 'cucumber/rake/task'
Cucumber::Rake::Task.new

default_tasks = %i[spec cucumber cck]

default_tasks << :examples if ENV['CI']

task default: default_tasks

require 'rake/clean'
CLEAN.include %w[**/*.{log,pyc,rbc,tgz} doc]

+ 180
- 0
UPGRADING.md View File

@@ -0,0 +1,180 @@
# Upgrading to 8.0.0

## AfterConfiguration hook

`AfterConfiguration` hook has been removed in 8.0.0.

Use the `InstallPlugin` hook if you need the `configuration` parameter.

```ruby
InstallPlugin do |configuration, registry|
# configuration is an instance of Cucumber::Configuration defined in
# lib/cucumber/configuration.rb
#
# registry is an instance of Cucumber::Glue::RegistryWrapper defined in
# lib/cucumber/glue/registry_wrapper.rb
end
```

Use the `BeforeAll` hook if you don't need the `configuration` parameter.

```ruby
BeforeAll do
# snip
end
```

More information about hooks can be found in [features/docs/writing_support_code/hooks/README.md](./features/docs/writing_support_code/hooks/README.md).

## The wire protocol

The built-in wire protocol has been removed.

The wire protocol is still available by explicitly using the `cucumber-wire` gem.

### Before cucumber 8.0.0

Before cucumber 8.0.0, the wire protocol was automatically installed with cucumber,
and automatically activated when it had detected a `.wire` file.

If you were using cucumber 7.1.0 and did not already migrate your code, you had a
deprecation message.

### With cucumber 8.0.0

If you are not using the wire protocol, you have nothing to do.

If you already have updated your code to remove the deprecation message shown when
using cucumber 7.1.0, you are already up-to-date. Nothing more has to be done.

If you are still using the built-in wire protocol here the step to migrate to cucumber 8.0.0:

- add the gem `cucumber-wire` to your Gemfile alongside the `cucumber` one, and install it:
```ruby
# Gemfile

# ...

gem "cucumber"
gem "cucumber-wire"

# ...

```
```shell
bundle install
```
- add `require 'cucumber/wire'` in your support code. If you do not have support
code yet, create a new one. For example `features/support/wire.rb`.
```ruby
# features/support/wire.rb
require 'cucumber/wire'
```

## `Cucumber::Cli::Main` former `stdin` argument

The second argument of `Cucumber::Cli::Main` - which was formerly named `stdin` -
has been removed.

### Before cucumber 8.0.0

You would have used `Cucumber::Cli::Main` with a dummy parameter:

```ruby
Cucumber::Cli::Main.new(
argument_list,
nil, # <-- this is a former unused `stdin` parameter
@stdout,
@stderr,
@kernel
).execute!
```

### With cucumber 8.0.0

The argument has been removed from the initializer so the dummy parameter is not
required anymore:

```ruby
Cucumber::Cli::Main.new(
argument_list,
@stdout,
@stderr,
@kernel
).execute!
```

## DataTable#map_column `strict` argument

The `strict` argument for the `map_column` method has changed to a keyword argument.

### Before 8.0.0

```ruby
table.map_column('column', false).do |value|
end
```

### With cucumber 8.0.0

```ruby
table.map_column('column', strict: false).do |value|
end
```

# Upgrading to 7.1.0

## The wire protocol

Usage of built-in wire protocol with `cucumber-ruby` will be deprecated in cucumber
7.1.0, and removed in cucumber 8.0.0.

The wire protocol will still be available by explicitly using the `cucumber-wire`
gem.

### Before cucumber 7.1.0

Before cucumber 7.1.0, the wire protocol was automatically installed with cucumber,
and automatically activated when it had detected a `.wire` file.

### With cucumber 7.1.0

The wire protocol will work as before, but you will notice a deprecation message.

To prevent the deprecation message to be shown, add the gem `cucumber-wire` to your
Gemfile alongside the `cucumber` one, and install it:

```ruby
# Gemfile

# ...

gem "cucumber"
gem "cucumber-wire"

# ...

```
```shell
bundle install
```

And add `require 'cucumber/wire'` in your support code. If you do not have support
code yet, create a new one. For example `features/support/wire.rb`.

```ruby
# features/support/wire.rb
require 'cucumber/wire'
```

The wire protocol will be installed, and no deprecation message will be shown anymore.

## AfterConfiguration hook

Usage of `AfterConfiguration` hook will be deprecated in 7.1.0.

Use the new `InstallPlugin` hook if you need the `configuration` parameter.

Use the new `BeforeAll` hook if you don't need the `configuration` parameter.

More information about hooks can be found in [features/docs/writing_support_code/hooks/README.md](./features/docs/writing_support_code/hooks/README.md).

+ 1
- 0
VERSION View File

@@ -0,0 +1 @@
8.0.0

+ 9
- 0
bin/cucumber View File

@@ -0,0 +1,9 @@
#!/usr/bin/env ruby
file_name = File.dirname(__FILE__) + '/../lib'
$LOAD_PATH.unshift(file_name) unless $LOAD_PATH.include?(file_name)

require 'simplecov_setup'
require 'cucumber/rspec/disable_option_parser'
require 'cucumber/cli/main'
# The dup is to keep ARGV intact, so that tools like ruby-debug can respawn.
Cucumber::Cli::Main.new(ARGV.dup).execute!

+ 29
- 0
bin/rspec View File

@@ -0,0 +1,29 @@
#!/usr/bin/env ruby
# frozen_string_literal: true

#
# This file was generated by Bundler.
#
# The application 'rspec' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile.local",
Pathname.new(__FILE__).realpath)

bundle_binstub = File.expand_path("../bundle", __FILE__)

if File.file?(bundle_binstub)
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
load(bundle_binstub)
else
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
end
end

require "rubygems"
require "bundler/setup"

load Gem.bin_path("rspec-core", "rspec")

+ 63
- 0
cucumber.gemspec View File

@@ -0,0 +1,63 @@
Gem::Specification.new do |s|
s.name = 'cucumber'
s.version = File.read(File.expand_path('VERSION', __dir__)).strip
s.authors = ['Aslak Hellesøy', 'Matt Wynne', 'Steve Tooke']
s.description = 'Behaviour Driven Development with elegance and joy'
s.summary = "cucumber-#{s.version}"
s.email = 'cukes@googlegroups.com'
s.license = 'MIT'
s.homepage = 'https://cucumber.io/'
s.platform = Gem::Platform::RUBY

s.metadata = {
'bug_tracker_uri' => 'https://github.com/cucumber/cucumber-ruby/issues',
'changelog_uri' => 'https://github.com/cucumber/cucumber-ruby/blob/main/CHANGELOG.md',
'documentation_uri' => 'https://www.rubydoc.info/github/cucumber/cucumber-ruby/',
'mailing_list_uri' => 'https://groups.google.com/forum/#!forum/cukes',
'source_code_uri' => 'https://github.com/cucumber/cucumber-ruby'
}

# Keep in sync with .circleci/config.yml & .rubocop.yml
s.required_ruby_version = '>= 2.6'
s.add_dependency 'builder', '~> 3.2', '>= 3.2.4'
s.add_dependency 'cucumber-ci-environment', '~> 9.0', '>= 9.0.4'
s.add_dependency 'cucumber-core', '~> 11.0', '>= 11.0.0'
s.add_dependency 'cucumber-cucumber-expressions', '>= 15.1.1', '< 17.0'
s.add_dependency 'cucumber-gherkin', '>= 23.0.1', '< 26.0.4'
s.add_dependency 'cucumber-html-formatter', '>= 19.1', '< 21.0'
s.add_dependency 'cucumber-messages', '>= 18', '< 22'
s.add_dependency 'diff-lcs', '~> 1.5', '>= 1.5.0'
s.add_dependency 'mini_mime', '~> 1.0'
s.add_dependency 'multi_test', '~> 1.1', '>= 1.1.0'
s.add_dependency 'sys-uname', '~> 1.2', '>= 1.2.2'

s.add_development_dependency 'cucumber-compatibility-kit', '~> 9.2', '>= 9.2.1'
s.add_development_dependency 'nokogiri', '~> 1.13', '>= 1.13.6'
s.add_development_dependency 'pry', '~> 0.14', '>= 0.14.1'
s.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
s.add_development_dependency 'rspec', '~> 3.11', '>= 3.11.0'
s.add_development_dependency 'simplecov', '~> 0.21', '>= 0.21.2'
s.add_development_dependency 'syntax', '~> 1.2', '>= 1.2.2'
s.add_development_dependency 'test-unit', '~> 3.5', '>= 3.5.3'
s.add_development_dependency 'webrick', '~> 1.7', '>= 1.7.0'

# For maintainer scripts
s.add_development_dependency 'octokit', '~> 4.22', '>= 4.22.0'

# Needed for examples (rake examples)
s.add_development_dependency 'capybara', '~> 3.36', '>= 3.36.0', '< 3.37'
s.add_development_dependency 'rack-test', '>= 1.1.0', '~> 2.0'
s.add_development_dependency 'sinatra', '>= 2.2.0', '~> 3.0'

s.required_rubygems_version = '>= 1.6.1'
s.files = Dir[
'CHANGELOG.md',
'CONTRIBUTING.md',
'README.md',
'LICENSE',
'lib/**/*'
]
s.executables = ['cucumber']
s.rdoc_options = ['--charset=UTF-8']
s.require_path = 'lib'
end

+ 18
- 0
cucumber.yml View File

@@ -0,0 +1,18 @@
<%
std_opts = "--format progress features -r features --strict --publish-quiet".dup
std_opts << " --tags 'not @wip'"
std_opts << " --tags 'not @wip-jruby'" if defined?(JRUBY_VERSION)

wip_opts = "--color -r features".dup
if defined?(JRUBY_VERSION)
wip_opts << " --tags '@wip or @wip-jruby'"
else
wip_opts << " --tags @wip"
end
%>
default: <%= std_opts %> --tags "not @jruby"
jruby: <%= std_opts %>
jruby_win: <%= std_opts %> CUCUMBER_FORWARD_SLASH_PATHS=true
windows_mri: <%= std_opts %> --tags "not @jruby" --tags "not @needs-many-fonts" --tags "not @todo-windows" CUCUMBER_FORWARD_SLASH_PATHS=true
wip: --wip <%= wip_opts %> features
none: --format pretty

+ 40
- 0
docs/jruby-limitations.md View File

@@ -0,0 +1,40 @@
# Cucumber and JRuby limitations

`cucumber` can be executed on `JRuby` (tested with `9.2`), although some of the features
are not available on this platform.

## Defining steps with native languages

There are currently three languages (Russian, Ukrainian and Uzbek) for which the step definition
can not be written in native language.
That means, for example, that you can not write the following code:

```ruby
Допустим('я ввожу число {int}') do |число|
calc.push число
end
```

Instead, you have to write:
```ruby
Given('я ввожу число {int}') do |number|
calc.push number
end
```

Of course, you can still write your feature files in a native language, for example, the following
feature file can be executed on JRuby:

```gherkin
# language: ru
Функционал: Сложение чисел
Чтобы не складывать в уме
Все, у кого с этим туго
Хотят автоматическое сложение целых чисел

Сценарий: Сложение двух целых чисел
Допустим я ввожу число 50
И затем ввожу число 70
Если я нажимаю "+"
То результатом должно быть число 120
```

+ 94
- 0
docs/vscode-example-launch-configuration.md View File

@@ -0,0 +1,94 @@
## Pre-requisites

### Ruby Extension

Install and configure the
[ruby extension](https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby)

### Use `debase` and `ruby-debug-ide` gems locally

Make sure to use a `Gemfile.local` file with `debase` and `ruby-debug-ide` gems.

~~~ruby
# Include the regular Gemfile
eval File.read('Gemfile')

group :development do
gem 'debase', require: false
gem 'ruby-debug-ide', require: false
end
~~~

Execute `bundle config set --local gemfile Gemfile.local` to use it per default,
then `bundle install`.

## Sample launch.json

The following `launch.json` - to be placed in the `.vscode` folder - allows to use
VSCode debugging features like **breakpoints** and **watches**.

```json
{
"version": "0.2.0",
"configurations": [
{
"name": "Cucumber",
"type": "Ruby",
"request": "launch",
"useBundler": true,
"cwd": "${workspaceRoot}",
"program": "${workspaceRoot}/bin/cucumber",
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "Cucumber current feature file",
"type": "Ruby",
"request": "launch",
"useBundler": true,
"cwd": "${workspaceRoot}",
"program": "${workspaceRoot}/bin/cucumber",
"args": ["${file}"],
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "Cucumber scenario under cursor",
"type": "Ruby",
"request": "launch",
"useBundler": true,
"cwd": "${workspaceRoot}",
"program": "${workspaceRoot}/bin/cucumber",
"args": ["${file}:${lineNumber}"],
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "Rspec",
"type": "Ruby",
"request": "launch",
"useBundler": true,
"cwd": "${workspaceRoot}",
"program": "${workspaceRoot}/bin/rspec",
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "Rspec current file",
"type": "Ruby",
"request": "launch",
"useBundler": true,
"cwd": "${workspaceRoot}",
"program": "${workspaceRoot}/bin/rspec",
"args": ["${file}"],
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "Rspec current line",
"type": "Ruby",
"request": "launch",
"useBundler": true,
"cwd": "${workspaceRoot}",
"program": "${workspaceRoot}/bin/rspec",
"args": ["${file}:${lineNumber}"],
"internalConsoleOptions": "openOnSessionStart"
}
]
}
```

+ 3
- 0
examples/i18n/README.textile View File

@@ -0,0 +1,3 @@
h1. Internationalisation (i18n) examples

Visit the "wiki":https://github.com/cucumber/cucumber/wiki/Spoken-languages for instructions on how to use Cucumber on different languages.

+ 50
- 0
examples/i18n/Rakefile View File

@@ -0,0 +1,50 @@
desc 'Run features for all languages'
task :cucumber do
dir = File.dirname(__FILE__)
Dir["#{dir}/*"].sort.each do |f|
next unless File.directory?(f)

lang = f[dir.length + 1..]
message = examples_disabled?(lang)
unless message.nil?
$stderr.puts(message)
next
end

Dir.chdir(f) do
puts "DIR: #{f}"
rake('cucumber')
end
end
end

task default: :cucumber

def examples_disabled?(lang)
return make_warning("SKIPPING #{lang} (The examples are out of date - please help update them)") unless examples_working?(lang)
return make_warning("SKIPPING #{lang}: examples have been disabled for JRuby.") if jruby_disabled_examples?(lang)
end

def jruby_disabled_examples?(lang)
return unless RUBY_PLATFORM == 'java'

%w[ru uk uz].include?(lang)
end

def examples_working?(lang)
!%w[ar].index(lang)
end

def make_warning(msg)
%(
!!!!!
!!!!!
!!!!! #{msg}
!!!!!
!!!!!
)
end

def rake(args)
ruby($PROGRAM_NAME, args)
end

+ 6
- 0
examples/i18n/ar/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 17
- 0
examples/i18n/ar/features/addition.feature View File

@@ -0,0 +1,17 @@
# language: ar
خاصية: الجمع
من اجل تجنب الأخطاء السخيفة
كشخص غبي في الرياضيات
اريد معرفة ناتج جمع عددين

سيناريو مخطط: جمع عددين
بفرض كتابة <input_1> في الآلة الحاسبة
و كتابة <input_2> في الآلة الحاسبة
متى يتم الضغط على <button>
اذاً يظهر <output> على الشاشة

امثلة:
| input_1 | input_2 | button | output |
| 20 | 30 | جمع | 50 |
| 2 | 5 | جمع | 7 |
| 0 | 40 | جمع | 40 |

+ 21
- 0
examples/i18n/ar/features/step_definitions/calculator_steps.rb View File

@@ -0,0 +1,21 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'calculator'

Before do
@calc = Calculator.new
end

After do
end

Given 'كتابة $n في الآلة الحاسبة' do |n|
@calc.push n.to_i
end

When(/يتم الضغط على (.+)/) do |op|
@result = @calc.send op
end

Then(/يظهر (.*) على الشاشة/) do |result|
expect(@result).to eq(result)
end

+ 10
- 0
examples/i18n/ar/lib/calculator.rb View File

@@ -0,0 +1,10 @@
class Calculator
def push(n)
@args ||= []
@args << n
end

def جمع
@args.inject(0) { |n, sum| sum + n }
end
end

+ 6
- 0
examples/i18n/bg/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 12
- 0
examples/i18n/bg/features/addition.feature View File

@@ -0,0 +1,12 @@
# language: bg
Функционалност: Събиране на числа
За да не го правят наум
Потребителите
Трябва да могат да събират числа с калкулатора

Сценарий: Събиране на две цели числа
Дадено е че съм въвел 50
И съм въвел 70
Когато натисна "+"
То резултата трябва да е равен на 120


+ 19
- 0
examples/i18n/bg/features/consecutive_calculations.feature View File

@@ -0,0 +1,19 @@
# language: bg
Функционалност: Последователни изчисления
За да не го правят наум
Потребителите
Трябва да могат да извършват последователни изчисления с калкулатора

Предистория:
Дадено е че съм събрал 3 и 5

Сценарий: събиране с резултата от последната операция
Когато въведа 4
И натисна "+"
То резултата трябва да е равен на 12

Сценарий: делене с резултата от последната операция
Когато въведа 2
И натисна "/"
То резултата трябва да е равен на 4


+ 17
- 0
examples/i18n/bg/features/division.feature View File

@@ -0,0 +1,17 @@
# language: bg
Функционалност: Делене на числа
За да не го правят наум
Потребителите
Трябва да могат да разделят числа с калкулатора

Рамка на сценарий: Делене на цели числа
Дадено е че съм въвел <делимо>
И е че съм въвел <делител>
Когато натисна "/"
То резултата трябва да е равен на <частно>

Примери:
| делимо | делител | частно |
| 100 | 2 | 50 |
| 28 | 7 | 4 |
| 0 | 5 | 0 |

+ 25
- 0
examples/i18n/bg/features/step_definitions/calculator_steps.rb View File

@@ -0,0 +1,25 @@
Дадено('е че съм въвел {int}') do |int|
calc.push int
end

Дадено('съм въвел {int}') do |int|
calc.push int
end

Дадено('е че съм събрал {int} и {int}') do |int1, int2|
calc.push int1
calc.push int2
calc.send '+'
end

Когато('въведа {int}') do |int|
calc.push int
end

Когато('натисна {string}') do |op|
calc.send op
end

То('резултата трябва да е равен на {int}') do |int|
expect(calc.result).to eq(int)
end

+ 9
- 0
examples/i18n/bg/features/support/env.rb View File

@@ -0,0 +1,9 @@
begin
require 'rspec/expectations'
rescue LoadError
require 'spec/expectations'
end

require 'cucumber/formatter/unicode'
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'calculator'

+ 7
- 0
examples/i18n/bg/features/support/world.rb View File

@@ -0,0 +1,7 @@
module LazyCalc
def calc
@calc ||= Calculator.new
end
end

World(LazyCalc)

+ 27
- 0
examples/i18n/bg/lib/calculator.rb View File

@@ -0,0 +1,27 @@
class Calculator
def initialize
@stack = []
end

def push(arg)
@stack.push arg
end

def result
@stack.last
end

def +
number_1 = @stack.pop
number_2 = @stack.pop

@stack.push number_1 + number_2
end

def /
divisor = @stack.pop
dividend = @stack.pop

@stack.push dividend / divisor
end
end

+ 6
- 0
examples/i18n/ca/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 18
- 0
examples/i18n/ca/features/step_definitions/calculator_steps.rb View File

@@ -0,0 +1,18 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'calculadora'

Before do
@calc = Calculadora.new
end

Donat(/que he introduït (\d+) a la calculadora/) do |n|
@calc.push n.to_i
end

Quan(/premo el (\w+)/) do |op|
@result = @calc.send op
end

Aleshores(/el resultat ha de ser (\d+) a la pantalla/) do |result|
expect(@result).to eq(result)
end

+ 17
- 0
examples/i18n/ca/features/suma.feature View File

@@ -0,0 +1,17 @@
# language: ca
Característica: Suma
Per evitar fer errors tontos
Com un matemàtic idiota
Vull saber la suma dels números

Esquema de l'escenari: Sumar dos números
Donat que he introduït <entrada_1> a la calculadora
I que he introduït <entrada_2> a la calculadora
Quan premo el <botó>
Aleshores el resultat ha de ser <resultat> a la pantalla

Exemples:
| entrada_1 | entrada_2 | botó | resultat |
| 20 | 30 | add | 50 |
| 2 | 5 | add | 7 |
| 0 | 40 | add | 40 |

+ 14
- 0
examples/i18n/ca/lib/calculadora.rb View File

@@ -0,0 +1,14 @@
class Calculadora
def push(n)
@args ||= []
@args << n
end

def add
@args.inject(0) { |n, sum| sum + n }
end

def divide
@args[0].to_f / @args[1].to_f
end
end

+ 1
- 0
examples/i18n/cs/.gitignore View File

@@ -0,0 +1 @@
features.html

+ 6
- 0
examples/i18n/cs/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 17
- 0
examples/i18n/cs/features/addition.feature View File

@@ -0,0 +1,17 @@
# language: cs
Požadavek: Sčítání
Jako matematický idiot
Abych se vyhnul hloupým chybám
Chci vědět jak sečíst dvě čísla

Náčrt Scénáře: Sčítaní dvou čísel
Pokud Zadám číslo <vstup_1> do kalkulačky
A Zadám číslo <vstup_2> do kalkulačky
Když stisknu <tlačítko>
Pak výsledek by měl být <výstup>

Příklady:
| vstup_1 | vstup_2 | tlačítko | výstup |
| 20 | 30 | add | 50 |
| 2 | 5 | add | 7 |
| 0 | 40 | add | 40 |

+ 11
- 0
examples/i18n/cs/features/division.feature View File

@@ -0,0 +1,11 @@
# language: cs
Požadavek: Dělení
Jako matematický idiot
Abych se vyhnul hloupým chybám
Chci vědět jak vydělit dvě čísla

Scénář: Přirozená čísla
Pokud Zadám číslo 3 do kalkulačky
A Zadám číslo 2 do kalkulačky
Když stisknu divide
Pak výsledek by měl být 1.5

+ 18
- 0
examples/i18n/cs/features/step_definitions/calculator_steps.rb View File

@@ -0,0 +1,18 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'calculator'

Before do
@calc = Calculator.new
end

Pokud('Zadám číslo {int} do kalkulačky') do |int|
@calc.push int
end

Když('stisknu {word}') do |op|
@result = @calc.send op
end

Pak('výsledek by měl být {float}') do |float|
expect(@result).to eq(float)
end

+ 14
- 0
examples/i18n/cs/lib/calculator.rb View File

@@ -0,0 +1,14 @@
class Calculator
def push(n)
@args ||= []
@args << n
end

def add
@args.inject(0) { |n, sum| sum + n }
end

def divide
@args[0].to_f / @args[1].to_f
end
end

+ 6
- 0
examples/i18n/da/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 18
- 0
examples/i18n/da/features/sammenlaegning.feature View File

@@ -0,0 +1,18 @@
# language: da
Egenskab: Sammenlægning
For at slippe for at lave dumme fejl
Som bogholder
Vil jeg kunne lægge sammen

Scenarie: to tal
Givet at jeg har indtastet 5
Og at jeg har indtastet 7
Når jeg lægger sammen
Så skal resultatet være 12

Scenarie: tre tal
Givet at jeg har indtastet 5
Og at jeg har indtastet 7
Og at jeg har indtastet 1
Når jeg lægger sammen
Så skal resultatet være 13

+ 28
- 0
examples/i18n/da/features/step_definitions/lommeregner_steps.rb View File

@@ -0,0 +1,28 @@
begin
require 'rspec/expectations'
rescue LoadError
require 'spec/expectations'
end

require 'cucumber/formatter/unicode'
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'lommeregner'

Before do
@calc = Lommeregner.new
end

After do
end

Given(/at jeg har indtastet (\d+)/) do |n|
@calc.push n.to_i
end

When('jeg lægger sammen') do
@result = @calc.add
end

Then(/skal resultatet være (\d*)/) do |result|
expect(@result).to eq(result.to_f)
end

+ 10
- 0
examples/i18n/da/lib/lommeregner.rb View File

@@ -0,0 +1,10 @@
class Lommeregner
def push(n)
@args ||= []
@args << n
end

def add
@args.inject(0) { |n, sum| sum + n }
end
end

+ 1
- 0
examples/i18n/de/.gitignore View File

@@ -0,0 +1 @@
features.html

+ 6
- 0
examples/i18n/de/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 17
- 0
examples/i18n/de/features/addition.feature View File

@@ -0,0 +1,17 @@
# language: de
Funktionalität: Addition
Um dumme Fehler zu vermeiden
möchte ich als Matheidiot
die Summe zweier Zahlen gesagt bekommen

Szenariogrundriss: Zwei Zahlen hinzufügen
Angenommen ich habe <Eingabe_1> in den Taschenrechner eingegeben
Und ich habe <Eingabe_2> in den Taschenrechner eingegeben
Wenn ich <Knopf> drücke
Dann sollte das Ergebniss auf dem Bildschirm <Ausgabe> sein

Beispiele:
| Eingabe_1 | Eingabe_2 | Knopf | Ausgabe |
| 20 | 30 | add | 50 |
| 2 | 5 | add | 7 |
| 0 | 40 | add | 40 |

+ 10
- 0
examples/i18n/de/features/division.feature View File

@@ -0,0 +1,10 @@
# language: de
Funktionalität: Division
Um dumme Fehler zu vermeiden
müssen Kassierer in der Lage sein einen Bruchteil zu berechnen

Szenario: Normale Zahlen
Gegeben sei ich habe 3 in den Taschenrechner eingegeben
Und ich habe 2 in den Taschenrechner eingegeben
Wenn ich divide drücke
Dann sollte das Ergebniss auf dem Bildschirm 1.5 sein

+ 28
- 0
examples/i18n/de/features/step_definitions/calculator_steps.rb View File

@@ -0,0 +1,28 @@
begin
require 'rspec/expectations'
rescue LoadError
require 'spec/expectations'
end

require 'cucumber/formatter/unicode'
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'calculator'

Before do
@calc = Calculator.new
end

After do
end

Angenommen(/ich habe (\d+) in den Taschenrechner eingegeben/) do |n|
@calc.push n.to_i
end

Wenn(/ich (\w+) drücke/) do |op|
@result = @calc.send op
end

Dann(/sollte das Ergebniss auf dem Bildschirm (.*) sein/) do |result|
expect(@result).to eq(result.to_f)
end

+ 14
- 0
examples/i18n/de/lib/calculator.rb View File

@@ -0,0 +1,14 @@
class Calculator
def push(n)
@args ||= []
@args << n
end

def add
@args.inject(0) { |n, sum| sum + n }
end

def divide
@args[0].to_f / @args[1].to_f
end
end

+ 1
- 0
examples/i18n/el/.gitignore View File

@@ -0,0 +1 @@
features.html

+ 6
- 0
examples/i18n/el/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 17
- 0
examples/i18n/el/features/addition.feature View File

@@ -0,0 +1,17 @@
# language: el
Δυνατότητα: Πρόσθεση
Για να αποφεύγω χαζά λάθη
Ως πρωτάρης στα μαθηματικά
Θέλω να βλέπω το άθροισμα δύο αριθμών

Περιγραφή Σεναρίου: Πρόσθεση δύο αριθμών
Δεδομένου ότι έχω εισάγει <τελεστής_1> στην αριθμομηχανή
Και έχω εισάγει <τελεστής_2> στην αριθμομηχανή
Όταν πατάω <κουμπί>
Τότε το αποτέλεσμα στην οθόνη πρέπει να είναι <αποτέλεσμα>

Παραδείγματα:
| τελεστής_1 | τελεστής_2 | κουμπί | αποτέλεσμα |
| 20 | 30 | add | 50 |
| 2 | 5 | add | 7 |
| 0 | 40 | add | 40 |

+ 10
- 0
examples/i18n/el/features/division.feature View File

@@ -0,0 +1,10 @@
# language: el
Δυνατότητα: Διαίρεση
Για να αποφευχθούν χαζά λάθη
Οι ταμίες θα πρέπει να μπορούν να υπολογίζουν κλάσματα

Σενάριο: Κανονικοί αριθμοί
Δεδομένου ότι έχω εισάγει 3 στην αριθμομηχανή
Και έχω εισάγει 2 στην αριθμομηχανή
Όταν πατάω divide
Τότε το αποτέλεσμα στην οθόνη πρέπει να είναι 1.5

+ 25
- 0
examples/i18n/el/features/step_definitions/calculator_steps.rb View File

@@ -0,0 +1,25 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'calculator'

Before do
@calc = Calculator.new
end

After do
end

Δεδομένου('ότι έχω εισάγει {int} στην αριθμομηχανή') do |int|
@calc.push int
end

Δεδομένου('έχω εισάγει {int} στην αριθμομηχανή') do |int|
@calc.push int
end

Όταν(/πατάω (\w+)/) do |op|
@result = @calc.send op
end

Τότε(/το αποτέλεσμα στην οθόνη πρέπει να είναι (.*)/) do |result|
expect(@result).to eq(result.to_f)
end

+ 14
- 0
examples/i18n/el/lib/calculator.rb View File

@@ -0,0 +1,14 @@
class Calculator
def push(n)
@args ||= []
@args << n
end

def add
@args.inject(0) { |n, sum| sum + n }
end

def divide
@args[0].to_f / @args[1].to_f
end
end

+ 4
- 0
examples/i18n/en-lol/Rakefile View File

@@ -0,0 +1,4 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new

+ 16
- 0
examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb View File

@@ -0,0 +1,16 @@
ICANHAZ(/^IN TEH BEGINNIN (\d+) CUCUMBRZ$/) do |n|
@basket = Basket.new(n.to_i)
end

WEN(/^I EAT (\d+) CUCUMBRZ$/) do |n|
@belly = Belly.new
@belly.eat(@basket.take(n.to_i))
end

DEN(/^I HAS (\d+) CUCUMBERZ IN MAH BELLY$/) do |n|
expect(@belly.cukes).to eq(n.to_i)
end

DEN(/^IN TEH END (\d+) CUCUMBRZ KTHXBAI$/) do |n|
expect(@basket.cukes).to eq(n.to_i)
end

+ 8
- 0
examples/i18n/en-lol/features/stuffing.feature View File

@@ -0,0 +1,8 @@
# language: en-lol
OH HAI: STUFFING

MISHUN: CUCUMBR
I CAN HAZ IN TEH BEGINNIN 3 CUCUMBRZ
WEN I EAT 2 CUCUMBRZ
DEN I HAS 2 CUCUMBERZ IN MAH BELLY
AN IN TEH END 1 CUCUMBRZ KTHXBAI

+ 10
- 0
examples/i18n/en-lol/features/support/env.rb View File

@@ -0,0 +1,10 @@
begin
require 'rspec/expectations'
rescue LoadError
require 'spec/expectations'
end

require 'cucumber/formatter/unicode'
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'basket'
require 'belly'

+ 12
- 0
examples/i18n/en-lol/lib/basket.rb View File

@@ -0,0 +1,12 @@
class Basket
attr_reader :cukes

def initialize(cukes)
@cukes = cukes
end

def take(cukes)
@cukes -= cukes
cukes
end
end

+ 11
- 0
examples/i18n/en-lol/lib/belly.rb View File

@@ -0,0 +1,11 @@
class Belly
attr_reader :cukes

def initialize
@cukes = 0
end

def eat(cukes)
@cukes += cukes
end
end

+ 1
- 0
examples/i18n/en/.gitignore View File

@@ -0,0 +1 @@
features.html

+ 6
- 0
examples/i18n/en/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 17
- 0
examples/i18n/en/features/addition.feature View File

@@ -0,0 +1,17 @@
# language: en
Feature: Addition
In order to avoid silly mistakes
As a math idiot
I want to be told the sum of two numbers

Scenario Outline: Add two numbers
Given I have entered <input_1> into the calculator
And I have entered <input_2> into the calculator
When I press <button>
Then the result should be <output> on the screen

Examples:
| input_1 | input_2 | button | output |
| 20 | 30 | add | 50 |
| 2 | 5 | add | 7 |
| 0 | 40 | add | 40 |

+ 10
- 0
examples/i18n/en/features/division.feature View File

@@ -0,0 +1,10 @@
# language: en
Feature: Division
In order to avoid silly mistakes
Cashiers must be able to calculate a fraction

Scenario: Regular numbers
* I have entered 3 into the calculator
* I have entered 2 into the calculator
* I press divide
* the result should be 1.5 on the screen

+ 21
- 0
examples/i18n/en/features/step_definitions/calculator_steps.rb View File

@@ -0,0 +1,21 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'calculator'

Before do
@calc = Calculator.new
end

After do
end

Given(/I have entered (\d+) into the calculator/) do |n|
@calc.push n.to_i
end

When(/I press (\w+)/) do |op|
@result = @calc.send op
end

Then(/the result should be (.*) on the screen/) do |result|
expect(@result).to eq(result.to_f)
end

+ 14
- 0
examples/i18n/en/lib/calculator.rb View File

@@ -0,0 +1,14 @@
class Calculator
def push(n)
@args ||= []
@args << n
end

def add
@args.inject(0) { |n, sum| sum + n }
end

def divide
@args[0].to_f / @args[1].to_f
end
end

+ 1
- 0
examples/i18n/eo/.gitignore View File

@@ -0,0 +1 @@
features.html

+ 6
- 0
examples/i18n/eo/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 17
- 0
examples/i18n/eo/features/adicio.feature View File

@@ -0,0 +1,17 @@
# language: eo
Trajto: Adicio
Por eviti stultajn erarojn
Kiel stultulo pri matematiko
Mi volas adicii du nombrojn

Kazo-skizo: Adiciu du nombrojn
Komence mi entajpas <nombro_1> en la kalkulilon
Kaj mi entajpas <nombro_2> en la kalkulilon
Se mi premas <butono>
Do la rezulto estu <rezulto>

Ekzemploj:
| nombro_1 | nombro_2 | butono | rezulto |
| 20 | 30 | add | 50 |
| 2 | 5 | add | 7 |
| 0 | 40 | add | 40 |

+ 10
- 0
examples/i18n/eo/features/divido.feature View File

@@ -0,0 +1,10 @@
# language: eo
Trajto: Divido
Por eviti stultajn erarojn
Uzantoj kapablu kalkuli frakciojn

Kazo: Simplaj nombroj
* mi entajpas 3 en la kalkulilon
* mi entajpas 2 en la kalkulilon
* mi premis divide
* la rezulto estu 1.5

+ 21
- 0
examples/i18n/eo/features/step_definitions/calculator_steps.rb View File

@@ -0,0 +1,21 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'calculator'

Before do
@calc = Calculator.new
end

After do
end

Se('mi entajpas {int} en la kalkulilon') do |int|
@calc.push int
end

Donitaĵo('mi premas/premis {word}') do |op|
@result = @calc.send op
end

Do('la rezulto estu {float}') do |float|
expect(@result).to eq(float)
end

+ 14
- 0
examples/i18n/eo/lib/calculator.rb View File

@@ -0,0 +1,14 @@
class Calculator
def push(n)
@args ||= []
@args << n
end

def add
@args.inject(0) { |n, sum| sum + n }
end

def divide
@args[0].to_f / @args[1].to_f
end
end

+ 6
- 0
examples/i18n/es/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 17
- 0
examples/i18n/es/features/adicion.feature View File

@@ -0,0 +1,17 @@
# language: es
Característica: adición
Para evitar hacer errores tontos
Como un matemático idiota
Quiero saber la suma de los números

Esquema del escenario: Sumar dos números
Dado que he introducido <entrada_1> en la calculadora
Y que he introducido <entrada_2> en la calculadora
Cuando oprimo el <botón>
Entonces el resultado debe ser <resultado> en la pantalla

Ejemplos:
| entrada_1 | entrada_2 | botón | resultado |
| 20 | 30 | add | 50 |
| 2 | 5 | add | 7 |
| 0 | 40 | add | 40 |

+ 18
- 0
examples/i18n/es/features/step_definitions/calculador_steps.rb View File

@@ -0,0 +1,18 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'calculador'

Before do
@calc = Calculador.new
end

Dado(/que he introducido (\d+) en la calculadora/) do |n|
@calc.push n.to_i
end

Cuando(/oprimo el (\w+)/) do |op|
@result = @calc.send op
end

Entonces(/el resultado debe ser (.*) en la pantalla/) do |result|
expect(@result).to eq(result.to_f)
end

+ 14
- 0
examples/i18n/es/lib/calculador.rb View File

@@ -0,0 +1,14 @@
class Calculador
def push(n)
@args ||= []
@args << n
end

def add
@args.inject(0) { |n, sum| sum + n }
end

def divide
@args[0].to_f / @args[1].to_f
end
end

+ 6
- 0
examples/i18n/et/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 10
- 0
examples/i18n/et/features/jagamine.feature View File

@@ -0,0 +1,10 @@
# language: et
Omadus: Jagamine
Rumalate vigade vältimiseks
Peavad kassapidajad saama arvutada murdudes

Stsenaarium: Tavalised numbrid
Eeldades et olen sisestanud kalkulaatorisse numbri 3
Ja olen sisestanud kalkulaatorisse numbri 2
Kui ma vajutan jaga
Siis vastuseks peab ekraanil kuvatama 1.5

+ 17
- 0
examples/i18n/et/features/liitmine.feature View File

@@ -0,0 +1,17 @@
# language: et
Omadus: Liitmine
Selleks et vältida rumalaid vigu
Olles matemaatika-puupea
Tahan et mulle öeldaks kahe numbri summa
Raamstsenaarium: Liida kaks numbrit
Eeldades et olen sisestanud kalkulaatorisse numbri <input_1>
Ja olen sisestanud kalkulaatorisse numbri <input_2>
Kui ma vajutan <button>
Siis vastuseks peab ekraanil kuvatama <output>

Juhtumid:
| input_1 | input_2 | button | output |
| 20 | 30 | liida | 50 |
| 2 | 5 | liida | 7 |
| 0 | 40 | liida | 40 |

+ 21
- 0
examples/i18n/et/features/step_definitions/kalkulaator_steps.rb View File

@@ -0,0 +1,21 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'kalkulaator'

Before do
@calc = Kalkulaator.new
end

After do
end

Given(/olen sisestanud kalkulaatorisse numbri (\d+)/) do |n|
@calc.push n.to_i
end

When(/ma vajutan (\w+)/) do |op|
@result = @calc.send op
end

Then(/vastuseks peab ekraanil kuvatama (.*)/) do |result|
expect(@result).to eq(result.to_f)
end

+ 14
- 0
examples/i18n/et/lib/kalkulaator.rb View File

@@ -0,0 +1,14 @@
class Kalkulaator
def push(n)
@args ||= []
@args << n
end

def liida
@args.inject(0) { |n, sum| sum + n }
end

def jaga
@args[0].to_f / @args[1].to_f
end
end

+ 1
- 0
examples/i18n/fi/.gitignore View File

@@ -0,0 +1 @@
features.html

+ 6
- 0
examples/i18n/fi/Rakefile View File

@@ -0,0 +1,6 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

+ 10
- 0
examples/i18n/fi/features/jakolasku.feature View File

@@ -0,0 +1,10 @@
# language: fi
Ominaisuus: Jakolasku
Välttyäkseen hölmöiltä virheiltä
Kassanhoitajan on voitava laskea osamäärä

Tapaus: Kokonaislukujen jakolasku
Oletetaan että olen syöttänyt laskimeen luvun 3
Ja että olen syöttänyt laskimeen luvun 2
Kun painan "jaa"
Niin laskimen ruudulla pitäisi näkyä tulos 1.5

+ 28
- 0
examples/i18n/fi/features/step_definitions/laskin_steps.rb View File

@@ -0,0 +1,28 @@
begin
require 'rspec/expectations'
rescue LoadError
require 'spec/expectations'
end

require 'cucumber/formatter/unicode'
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib")
require 'laskin'

Before do
@laskin = Laskin.new
end

After do
end

Given(/että olen syöttänyt laskimeen luvun (\d+)/) do |n|
@laskin.pinoa n.to_i
end

When(/painan "(\w+)"/) do |op|
@tulos = @laskin.send op
end

Then(/laskimen ruudulla pitäisi näkyä tulos (.*)/) do |tulos|
expect(@tulos).to eq(tulos.to_f)
end

+ 17
- 0
examples/i18n/fi/features/yhteenlasku.feature View File

@@ -0,0 +1,17 @@
# language: fi
Ominaisuus: Yhteenlasku
Välttyäkseni hölmöiltä virheiltä
Koska olen laskutaidoton
Haluan että yhteenlaskut lasketaan puolestani

Tapausaihio: Kahden luvun summa
Oletetaan että olen syöttänyt laskimeen luvun <luku_1>
Ja että olen syöttänyt laskimeen luvun <luku_2>
Kun painan "<nappi>"
Niin laskimen ruudulla pitäisi näkyä tulos <tulos>

Tapaukset:
| luku_1 | luku_2 | nappi | tulos |
| 20 | 30 | summaa | 50 |
| 2 | 5 | summaa | 7 |
| 0 | 40 | summaa | 40 |

+ 14
- 0
examples/i18n/fi/lib/laskin.rb View File

@@ -0,0 +1,14 @@
class Laskin
def pinoa(n)
@args ||= []
@args << n
end

def summaa
@args.inject(0) { |n, sum| sum + n }
end

def jaa
@args[0].to_f / @args[1].to_f
end
end

+ 8
- 0
examples/i18n/fr/Rakefile View File

@@ -0,0 +1,8 @@
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib")
require 'cucumber/rake/task'

Cucumber::Rake::Task.new do |t|
t.cucumber_opts = %w[--format pretty]
end

task default: :cucumber

+ 18
- 0
examples/i18n/fr/features/addition.feature View File

@@ -0,0 +1,18 @@
# language: fr
Fonctionnalité: Addition
Afin de gagner du temps lors du calcul de la facture
En tant que commerçant
Je souhaite pouvoir faire une addition

Plan du Scénario: Addition de deux nombres
Soit une calculatrice
Et que j'entre <a> pour le premier nombre
Et que je tape sur la touche "+"
Et que j'entre <b> pour le second nombre
Lorsque je tape sur la touche "="
Alors le résultat affiché doit être <somme>

Exemples:
| a | b | somme |
| 2 | 2 | 4 |
| 2 | 3 | 5 |

+ 17
- 0
examples/i18n/fr/features/addition2.feature View File

@@ -0,0 +1,17 @@
# language: fr
Fonctionnalité: Addition
Afin de financer mon bonus avec l'argent des pigeons
En tant que trader
Je souhaite pouvoir additionner 2 chiffres

Plan du Scénario: Addition de produits dérivés
Soit une calculatrice
Etant donné qu'on tape <a>
Et qu'on tape <b>
Lorsqu'on tape additionner
Alors le résultat doit être <somme>

Exemples:
| a | b | somme |
| 2 | 2 | 4 |
| 2 | 3 | 5 |

+ 27
- 0
examples/i18n/fr/features/step_definitions/calculatrice_steps.rb View File

@@ -0,0 +1,27 @@
Soit(/^une calculatrice$/) do
@calc = Calculatrice.new
end

Etantdonnéqu('on tape {int}') do |entier|
@calc.push entier
end

Soit("j'entre {int} pour le premier/second nombre") do |entier|
@calc.push entier
end

Soit('je tape sur la touche {string}') do |_touche|
@result = @calc.additionner
end

Lorsqu(/on tape additionner/) do
@result = @calc.additionner
end

Alors('le résultat affiché doit être {float}') do |resultat_attendu|
expect(@result).to eq(resultat_attendu)
end

Alors('le résultat doit être {float}') do |resultat_attendu|
expect(@result).to eq(resultat_attendu)
end

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save