cucumber-cucumber-expressions 16.1.2 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +27 -0
  3. data/.rubocop_todo.yml +524 -0
  4. data/Gemfile +2 -1
  5. data/Rakefile +4 -17
  6. data/VERSION +1 -1
  7. data/cucumber-cucumber-expressions.gemspec +11 -9
  8. data/lib/cucumber/cucumber_expressions/argument.rb +6 -3
  9. data/lib/cucumber/cucumber_expressions/ast.rb +24 -59
  10. data/lib/cucumber/cucumber_expressions/combinatorial_generated_expression_factory.rb +6 -13
  11. data/lib/cucumber/cucumber_expressions/cucumber_expression.rb +9 -11
  12. data/lib/cucumber/cucumber_expressions/cucumber_expression_generator.rb +7 -11
  13. data/lib/cucumber/cucumber_expressions/cucumber_expression_parser.rb +37 -53
  14. data/lib/cucumber/cucumber_expressions/cucumber_expression_tokenizer.rb +13 -18
  15. data/lib/cucumber/cucumber_expressions/errors.rb +119 -101
  16. data/lib/cucumber/cucumber_expressions/expression_factory.rb +2 -0
  17. data/lib/cucumber/cucumber_expressions/generated_expression.rb +2 -0
  18. data/lib/cucumber/cucumber_expressions/group.rb +2 -0
  19. data/lib/cucumber/cucumber_expressions/group_builder.rb +2 -0
  20. data/lib/cucumber/cucumber_expressions/parameter_type.rb +13 -23
  21. data/lib/cucumber/cucumber_expressions/parameter_type_matcher.rb +8 -6
  22. data/lib/cucumber/cucumber_expressions/parameter_type_registry.rb +23 -20
  23. data/lib/cucumber/cucumber_expressions/regular_expression.rb +3 -2
  24. data/lib/cucumber/cucumber_expressions/tree_regexp.rb +5 -4
  25. data/spec/cucumber/cucumber_expressions/argument_spec.rb +4 -2
  26. data/spec/cucumber/cucumber_expressions/combinatorial_generated_expression_factory_test.rb +7 -6
  27. data/spec/cucumber/cucumber_expressions/cucumber_expression_generator_spec.rb +104 -101
  28. data/spec/cucumber/cucumber_expressions/cucumber_expression_parser_spec.rb +2 -0
  29. data/spec/cucumber/cucumber_expressions/cucumber_expression_spec.rb +84 -87
  30. data/spec/cucumber/cucumber_expressions/cucumber_expression_tokenizer_spec.rb +3 -1
  31. data/spec/cucumber/cucumber_expressions/cucumber_expression_transformation_spec.rb +2 -0
  32. data/spec/cucumber/cucumber_expressions/custom_parameter_type_spec.rb +79 -60
  33. data/spec/cucumber/cucumber_expressions/expression_factory_spec.rb +2 -0
  34. data/spec/cucumber/cucumber_expressions/parameter_type_registry_spec.rb +43 -48
  35. data/spec/cucumber/cucumber_expressions/parameter_type_spec.rb +3 -1
  36. data/spec/cucumber/cucumber_expressions/regular_expression_spec.rb +37 -28
  37. data/spec/cucumber/cucumber_expressions/tree_regexp_spec.rb +23 -22
  38. metadata +21 -9
  39. data/.rspec +0 -1
  40. data/scripts/update-gemspec +0 -32
  41. data/spec/capture_warnings.rb +0 -74
@@ -1,23 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/cucumber_expressions/ast'
2
4
 
3
5
  module Cucumber
4
6
  module CucumberExpressions
5
7
  class CucumberExpressionError < StandardError
6
-
7
- def build_message(
8
- index,
9
- expression,
10
- pointer,
11
- problem,
12
- solution
13
- )
14
- m = <<-EOF
15
- This Cucumber Expression has a problem at column #{index + 1}:
16
-
17
- #{expression}
18
- #{pointer}
19
- #{problem}.
20
- #{solution}
8
+ def build_message(index, expression, pointer, problem, solution)
9
+ m = <<~EOF
10
+ This Cucumber Expression has a problem at column #{index + 1}:
11
+
12
+ #{expression}
13
+ #{pointer}
14
+ #{problem}.
15
+ #{solution}
21
16
  EOF
22
17
  m.strip
23
18
  end
@@ -40,86 +35,100 @@ This Cucumber Expression has a problem at column #{index + 1}:
40
35
 
41
36
  class AlternativeMayNotExclusivelyContainOptionals < CucumberExpressionError
42
37
  def initialize(node, expression)
43
- super(build_message(
44
- node.start,
45
- expression,
46
- point_at_located(node),
47
- 'An alternative may not exclusively contain optionals',
48
- "If you did not mean to use an optional you can use '\\(' to escape the the '('"
49
- ))
38
+ super(
39
+ build_message(
40
+ node.start,
41
+ expression,
42
+ point_at_located(node),
43
+ 'An alternative may not exclusively contain optionals',
44
+ "If you did not mean to use an optional you can use '\\(' to escape the the '('"
45
+ )
46
+ )
50
47
  end
51
48
  end
52
49
 
53
50
  class AlternativeMayNotBeEmpty < CucumberExpressionError
54
51
  def initialize(node, expression)
55
- super(build_message(
56
- node.start,
57
- expression,
58
- point_at_located(node),
59
- 'Alternative may not be empty',
60
- "If you did not mean to use an alternative you can use '\\/' to escape the the '/'"
61
- ))
52
+ super(
53
+ build_message(
54
+ node.start,
55
+ expression,
56
+ point_at_located(node),
57
+ 'Alternative may not be empty',
58
+ "If you did not mean to use an alternative you can use '\\/' to escape the the '/'"
59
+ )
60
+ )
62
61
  end
63
62
  end
64
63
 
65
64
  class CantEscape < CucumberExpressionError
66
65
  def initialize(expression, index)
67
- super(build_message(
68
- index,
69
- expression,
70
- point_at(index),
71
- "Only the characters '{', '}', '(', ')', '\\', '/' and whitespace can be escaped",
72
- "If you did mean to use an '\\' you can use '\\\\' to escape it"
73
- ))
66
+ super(
67
+ build_message(
68
+ index,
69
+ expression,
70
+ point_at(index),
71
+ "Only the characters '{', '}', '(', ')', '\\', '/' and whitespace can be escaped",
72
+ "If you did mean to use an '\\' you can use '\\\\' to escape it"
73
+ )
74
+ )
74
75
  end
75
76
  end
76
77
 
77
78
  class OptionalMayNotBeEmpty < CucumberExpressionError
78
79
  def initialize(node, expression)
79
- super(build_message(
80
- node.start,
81
- expression,
82
- point_at_located(node),
83
- 'An optional must contain some text',
84
- "If you did not mean to use an optional you can use '\\(' to escape the the '('"
85
- ))
80
+ super(
81
+ build_message(
82
+ node.start,
83
+ expression,
84
+ point_at_located(node),
85
+ 'An optional must contain some text',
86
+ "If you did not mean to use an optional you can use '\\(' to escape the the '('"
87
+ )
88
+ )
86
89
  end
87
90
  end
88
91
 
89
92
  class ParameterIsNotAllowedInOptional < CucumberExpressionError
90
93
  def initialize(node, expression)
91
- super(build_message(
92
- node.start,
93
- expression,
94
- point_at_located(node),
95
- 'An optional may not contain a parameter type',
96
- "If you did not mean to use an parameter type you can use '\\{' to escape the the '{'"
97
- ))
94
+ super(
95
+ build_message(
96
+ node.start,
97
+ expression,
98
+ point_at_located(node),
99
+ 'An optional may not contain a parameter type',
100
+ "If you did not mean to use an parameter type you can use '\\{' to escape the the '{'"
101
+ )
102
+ )
98
103
  end
99
104
  end
100
105
 
101
106
  class OptionalIsNotAllowedInOptional < CucumberExpressionError
102
107
  def initialize(node, expression)
103
- super(build_message(
104
- node.start,
105
- expression,
106
- point_at_located(node),
107
- 'An optional may not contain an other optional',
108
- "If you did not mean to use an optional type you can use '\\(' to escape the the '('. For more complicated expressions consider using a regular expression instead."
109
- ))
108
+ super(
109
+ build_message(
110
+ node.start,
111
+ expression,
112
+ point_at_located(node),
113
+ 'An optional may not contain an other optional',
114
+ "If you did not mean to use an optional type you can use '\\(' to escape the the '('. For more complicated expressions consider using a regular expression instead."
115
+ )
116
+ )
110
117
  end
111
118
  end
112
119
 
113
120
  class TheEndOfLineCannotBeEscaped < CucumberExpressionError
114
121
  def initialize(expression)
115
122
  index = expression.codepoints.length - 1
116
- super(build_message(
117
- index,
118
- expression,
119
- point_at(index),
120
- 'The end of line can not be escaped',
121
- "You can use '\\\\' to escape the the '\\'"
122
- ))
123
+ super(
124
+ build_message(
125
+ index,
126
+ expression,
127
+ point_at(index),
128
+ 'The end of line can not be escaped',
129
+ "You can use '\\\\' to escape the the '\\'"
130
+ )
131
+ )
123
132
  end
124
133
  end
125
134
 
@@ -128,45 +137,50 @@ This Cucumber Expression has a problem at column #{index + 1}:
128
137
  begin_symbol = Token::symbol_of(begin_token)
129
138
  end_symbol = Token::symbol_of(end_token)
130
139
  purpose = Token::purpose_of(begin_token)
131
- super(build_message(
132
- current.start,
133
- expression,
134
- point_at_located(current),
135
- "The '#{begin_symbol}' does not have a matching '#{end_symbol}'",
136
- "If you did not intend to use #{purpose} you can use '\\#{begin_symbol}' to escape the #{purpose}"
137
- ))
140
+
141
+ super(
142
+ build_message(
143
+ current.start,
144
+ expression,
145
+ point_at_located(current),
146
+ "The '#{begin_symbol}' does not have a matching '#{end_symbol}'",
147
+ "If you did not intend to use #{purpose} you can use '\\#{begin_symbol}' to escape the #{purpose}"
148
+ )
149
+ )
138
150
  end
139
151
  end
140
152
 
141
153
  class AlternationNotAllowedInOptional < CucumberExpressionError
142
154
  def initialize(expression, current)
143
- super(build_message(
144
- current.start,
145
- expression,
146
- point_at_located(current),
147
- "An alternation can not be used inside an optional",
148
- "You can use '\\/' to escape the the '/'"
149
- ))
155
+ super(
156
+ build_message(
157
+ current.start,
158
+ expression,
159
+ point_at_located(current),
160
+ 'An alternation can not be used inside an optional',
161
+ "You can use '\\/' to escape the the '/'"
162
+ )
163
+ )
150
164
  end
151
165
  end
152
166
 
153
167
  class InvalidParameterTypeName < CucumberExpressionError
154
168
  def initialize(type_name)
155
- super("Illegal character in parameter name {#{type_name}}. " +
156
- "Parameter names may not contain '{', '}', '(', ')', '\\' or '/'")
169
+ super("Illegal character in parameter name {#{type_name}}. Parameter names may not contain '{', '}', '(', ')', '\\' or '/'")
157
170
  end
158
171
  end
159
172
 
160
-
161
173
  class InvalidParameterTypeNameInNode < CucumberExpressionError
162
174
  def initialize(expression, token)
163
- super(build_message(
164
- token.start,
165
- expression,
166
- point_at_located(token),
167
- "Parameter names may not contain '{', '}', '(', ')', '\\' or '/'",
168
- "Did you mean to use a regular expression?"
169
- ))
175
+ super(
176
+ build_message(
177
+ token.start,
178
+ expression,
179
+ point_at_located(token),
180
+ "Parameter names may not contain '{', '}', '(', ')', '\\' or '/'",
181
+ 'Did you mean to use a regular expression?'
182
+ )
183
+ )
170
184
  end
171
185
  end
172
186
 
@@ -174,28 +188,32 @@ This Cucumber Expression has a problem at column #{index + 1}:
174
188
  attr_reader :undefined_parameter_type_name
175
189
 
176
190
  def initialize(node, expression, undefined_parameter_type_name)
177
- super(build_message(node.start,
178
- expression,
179
- point_at_located(node),
180
- "Undefined parameter type '#{undefined_parameter_type_name}'",
181
- "Please register a ParameterType for '#{undefined_parameter_type_name}'"))
191
+ super(
192
+ build_message(
193
+ node.start,
194
+ expression,
195
+ point_at_located(node),
196
+ "Undefined parameter type '#{undefined_parameter_type_name}'",
197
+ "Please register a ParameterType for '#{undefined_parameter_type_name}'"
198
+ )
199
+ )
182
200
  @undefined_parameter_type_name = undefined_parameter_type_name
183
201
  end
184
202
  end
185
203
 
186
204
  class AmbiguousParameterTypeError < CucumberExpressionError
187
205
  def initialize(parameter_type_regexp, expression_regexp, parameter_types, generated_expressions)
188
- super(<<-EOM)
189
- Your Regular Expression /#{expression_regexp.source}/
190
- matches multiple parameter types with regexp /#{parameter_type_regexp}/:
191
- #{parameter_type_names(parameter_types)}
206
+ super(<<~EOM)
207
+ Your Regular Expression /#{expression_regexp.source}/
208
+ matches multiple parameter types with regexp /#{parameter_type_regexp}/:
209
+ #{parameter_type_names(parameter_types)}
192
210
 
193
- I couldn't decide which one to use. You have two options:
211
+ I couldn't decide which one to use. You have two options:
194
212
 
195
- 1) Use a Cucumber Expression instead of a Regular Expression. Try one of these:
196
- #{expressions(generated_expressions)}
213
+ 1) Use a Cucumber Expression instead of a Regular Expression. Try one of these:
214
+ #{expressions(generated_expressions)}
197
215
 
198
- 2) Make one of the parameter types preferential and continue to use a Regular Expression.
216
+ 2) Make one of the parameter types preferential and continue to use a Regular Expression.
199
217
 
200
218
  EOM
201
219
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/cucumber_expressions/errors'
2
4
  require 'cucumber/cucumber_expressions/cucumber_expression'
3
5
  require 'cucumber/cucumber_expressions/regular_expression'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module CucumberExpressions
3
5
  class GeneratedExpression
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module CucumberExpressions
3
5
  class Group
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/cucumber_expressions/group'
2
4
 
3
5
  module Cucumber
@@ -1,17 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/cucumber_expressions/errors'
2
4
 
3
5
  module Cucumber
4
6
  module CucumberExpressions
5
7
  class ParameterType
6
- ILLEGAL_PARAMETER_NAME_PATTERN = /([\[\]()$.|?*+])/
7
- UNESCAPE_PATTERN = /(\\([\[$.|?*+\]]))/
8
+ ILLEGAL_PARAMETER_NAME_PATTERN = /([\[\]()$.|?*+])/.freeze
9
+ UNESCAPE_PATTERN = /(\\([\[$.|?*+\]]))/.freeze
8
10
 
9
- attr_reader :name, :type, :regexps
11
+ attr_reader :name, :type, :transformer, :use_for_snippets, :prefer_for_regexp_match, :regexps
10
12
 
11
13
  def self.check_parameter_type_name(type_name)
12
- unless is_valid_parameter_type_name(type_name)
13
- raise CucumberExpressionError.new("Illegal character in parameter name {#{type_name}}. Parameter names may not contain '[]()$.|?*+'")
14
- end
14
+ raise CucumberExpressionError.new("Illegal character in parameter name {#{type_name}}. Parameter names may not contain '[]()$.|?*+'") unless is_valid_parameter_type_name(type_name)
15
15
  end
16
16
 
17
17
  def self.is_valid_parameter_type_name(type_name)
@@ -21,14 +21,6 @@ module Cucumber
21
21
  !(ILLEGAL_PARAMETER_NAME_PATTERN =~ unescaped_type_name)
22
22
  end
23
23
 
24
- def prefer_for_regexp_match?
25
- @prefer_for_regexp_match
26
- end
27
-
28
- def use_for_snippets?
29
- @use_for_snippets
30
- end
31
-
32
24
  # Create a new Parameter
33
25
  #
34
26
  # @param name the name of the parameter type
@@ -55,14 +47,14 @@ module Cucumber
55
47
  end
56
48
 
57
49
  def <=>(other)
58
- return -1 if prefer_for_regexp_match? && !other.prefer_for_regexp_match?
59
- return 1 if other.prefer_for_regexp_match? && !prefer_for_regexp_match?
50
+ return -1 if prefer_for_regexp_match && !other.prefer_for_regexp_match
51
+ return 1 if other.prefer_for_regexp_match && !prefer_for_regexp_match
52
+
60
53
  return name <=> other.name
61
54
  end
62
55
 
63
56
  private
64
57
 
65
-
66
58
  def string_array(regexps)
67
59
  array = regexps.is_a?(Array) ? regexps : [regexps]
68
60
  array.map { |regexp| regexp.is_a?(String) ? regexp : regexp_source(regexp) }
@@ -70,14 +62,12 @@ module Cucumber
70
62
 
71
63
  def regexp_source(regexp)
72
64
  [
73
- 'EXTENDED',
74
- 'IGNORECASE',
75
- 'MULTILINE'
65
+ 'EXTENDED',
66
+ 'IGNORECASE',
67
+ 'MULTILINE'
76
68
  ].each do |option_name|
77
69
  option = Regexp.const_get(option_name)
78
- if regexp.options & option != 0
79
- raise CucumberExpressionError.new("ParameterType Regexps can't use option Regexp::#{option_name}")
80
- end
70
+ raise CucumberExpressionError.new("ParameterType Regexps can't use option Regexp::#{option_name}") if regexp.options & option != 0
81
71
  end
82
72
  regexp.source
83
73
  end
@@ -1,20 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module CucumberExpressions
3
5
  class ParameterTypeMatcher
4
6
  attr_reader :parameter_type
5
7
 
6
- def initialize(parameter_type, regexp, text, match_position=0)
8
+ def initialize(parameter_type, regexp, text, match_position = 0)
7
9
  @parameter_type, @regexp, @text = parameter_type, regexp, text
8
10
  @match = @regexp.match(@text, match_position)
9
11
  end
10
12
 
11
13
  def advance_to(new_match_position)
12
- (new_match_position...@text.length).each {|advancedPos|
14
+ (new_match_position...@text.length).each do |advancedPos|
13
15
  matcher = self.class.new(parameter_type, @regexp, @text, advancedPos)
14
- if matcher.find && matcher.full_word?
15
- return matcher
16
- end
17
- }
16
+ return matcher if matcher.find && matcher.full_word?
17
+ end
18
18
 
19
19
  self.class.new(parameter_type, @regexp, @text, @text.length)
20
20
  end
@@ -38,8 +38,10 @@ module Cucumber
38
38
  def <=>(other)
39
39
  pos_comparison = start <=> other.start
40
40
  return pos_comparison if pos_comparison != 0
41
+
41
42
  length_comparison = other.group.length <=> group.length
42
43
  return length_comparison if length_comparison != 0
44
+
43
45
  0
44
46
  end
45
47
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/cucumber_expressions/parameter_type'
2
4
  require 'cucumber/cucumber_expressions/errors'
3
5
  require 'cucumber/cucumber_expressions/cucumber_expression_generator'
@@ -6,27 +8,27 @@ require 'bigdecimal'
6
8
  module Cucumber
7
9
  module CucumberExpressions
8
10
  class ParameterTypeRegistry
9
- INTEGER_REGEXPS = [/-?\d+/, /\d+/]
10
- FLOAT_REGEXP = /(?=.*\d.*)[-+]?\d*(?:\.(?=\d.*))?\d*(?:\d+[E][-+]?\d+)?/
11
- WORD_REGEXP = /[^\s]+/
12
- STRING_REGEXP = /"([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'/
13
- ANONYMOUS_REGEXP = /.*/
11
+ INTEGER_REGEXPS = [/-?\d+/, /\d+/].freeze
12
+ FLOAT_REGEXP = /(?=.*\d.*)[-+]?\d*(?:\.(?=\d.*))?\d*(?:\d+[E][-+]?\d+)?/.freeze
13
+ WORD_REGEXP = /[^\s]+/.freeze
14
+ STRING_REGEXP = /"([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'/.freeze
15
+ ANONYMOUS_REGEXP = /.*/.freeze
14
16
 
15
17
  def initialize
16
18
  @parameter_type_by_name = {}
17
19
  @parameter_types_by_regexp = Hash.new {|hash, regexp| hash[regexp] = []}
18
20
 
19
- define_parameter_type(ParameterType.new('int', INTEGER_REGEXPS, Integer, lambda {|s = nil| s && s.to_i}, true, true))
20
- define_parameter_type(ParameterType.new('float', FLOAT_REGEXP, Float, lambda {|s = nil| s && s.to_f}, true, false))
21
- define_parameter_type(ParameterType.new('word', WORD_REGEXP, String, lambda {|s = nil| s}, false, false))
22
- define_parameter_type(ParameterType.new('string', STRING_REGEXP, String, lambda { |s1, s2| arg = s1 != nil ? s1 : s2; arg.gsub(/\\"/, '"').gsub(/\\'/, "'")}, true, false))
23
- define_parameter_type(ParameterType.new('', ANONYMOUS_REGEXP, String, lambda {|s = nil| s}, false, true))
24
- define_parameter_type(ParameterType.new('bigdecimal', FLOAT_REGEXP, BigDecimal, lambda {|s = nil| BigDecimal(s)}, false, false))
25
- define_parameter_type(ParameterType.new('biginteger', INTEGER_REGEXPS, Integer, lambda {|s = nil| s && s.to_i}, false, false))
26
- define_parameter_type(ParameterType.new('byte', INTEGER_REGEXPS, Integer, lambda {|s = nil| s && s.to_i}, false, false))
27
- define_parameter_type(ParameterType.new('short', INTEGER_REGEXPS, Integer, lambda {|s = nil| s && s.to_i}, false, false))
28
- define_parameter_type(ParameterType.new('long', INTEGER_REGEXPS, Integer, lambda {|s = nil| s && s.to_i}, false, false))
29
- define_parameter_type(ParameterType.new('double', FLOAT_REGEXP, Float, lambda {|s = nil| s && s.to_f}, false, false))
21
+ define_parameter_type(ParameterType.new('int', INTEGER_REGEXPS, Integer, ->(s = nil) { s && s.to_i}, true, true))
22
+ define_parameter_type(ParameterType.new('float', FLOAT_REGEXP, Float, ->(s = nil) { s && s.to_f}, true, false))
23
+ define_parameter_type(ParameterType.new('word', WORD_REGEXP, String, ->(s = nil) { s}, false, false))
24
+ define_parameter_type(ParameterType.new('string', STRING_REGEXP, String, ->(s1, s2) { arg = s1 != nil ? s1 : s2; arg.gsub(/\\"/, '"').gsub(/\\'/, "'")}, true, false))
25
+ define_parameter_type(ParameterType.new('', ANONYMOUS_REGEXP, String, ->(s = nil) { s}, false, true))
26
+ define_parameter_type(ParameterType.new('bigdecimal', FLOAT_REGEXP, BigDecimal, ->(s = nil) { BigDecimal(s)}, false, false))
27
+ define_parameter_type(ParameterType.new('biginteger', INTEGER_REGEXPS, Integer, ->(s = nil) { s && s.to_i}, false, false))
28
+ define_parameter_type(ParameterType.new('byte', INTEGER_REGEXPS, Integer, ->(s = nil) { s && s.to_i}, false, false))
29
+ define_parameter_type(ParameterType.new('short', INTEGER_REGEXPS, Integer, ->(s = nil) { s && s.to_i}, false, false))
30
+ define_parameter_type(ParameterType.new('long', INTEGER_REGEXPS, Integer, ->(s = nil) { s && s.to_i}, false, false))
31
+ define_parameter_type(ParameterType.new('double', FLOAT_REGEXP, Float, ->(s = nil) { s && s.to_f}, false, false))
30
32
  end
31
33
 
32
34
  def lookup_by_type_name(name)
@@ -36,7 +38,8 @@ module Cucumber
36
38
  def lookup_by_regexp(parameter_type_regexp, expression_regexp, text)
37
39
  parameter_types = @parameter_types_by_regexp[parameter_type_regexp]
38
40
  return nil if parameter_types.nil?
39
- if parameter_types.length > 1 && !parameter_types[0].prefer_for_regexp_match?
41
+
42
+ if parameter_types.length > 1 && !parameter_types[0].prefer_for_regexp_match
40
43
  # We don't do this check on insertion because we only want to restrict
41
44
  # ambiguity when we look up by Regexp. Users of CucumberExpression should
42
45
  # not be restricted.
@@ -54,7 +57,7 @@ module Cucumber
54
57
  if parameter_type.name != nil
55
58
  if @parameter_type_by_name.has_key?(parameter_type.name)
56
59
  if parameter_type.name.length == 0
57
- raise CucumberExpressionError.new("The anonymous parameter type has already been defined")
60
+ raise CucumberExpressionError.new('The anonymous parameter type has already been defined')
58
61
  else
59
62
  raise CucumberExpressionError.new("There is already a parameter with name #{parameter_type.name}")
60
63
  end
@@ -64,14 +67,14 @@ module Cucumber
64
67
 
65
68
  parameter_type.regexps.each do |parameter_type_regexp|
66
69
  parameter_types = @parameter_types_by_regexp[parameter_type_regexp]
67
- if parameter_types.any? && parameter_types[0].prefer_for_regexp_match? && parameter_type.prefer_for_regexp_match?
70
+ if parameter_types.any? && parameter_types[0].prefer_for_regexp_match && parameter_type.prefer_for_regexp_match
68
71
  raise CucumberExpressionError.new("There can only be one preferential parameter type per regexp. The regexp /#{parameter_type_regexp}/ is used for two preferential parameter types, {#{parameter_types[0].name}} and {#{parameter_type.name}}")
69
72
  end
73
+
70
74
  parameter_types.push(parameter_type)
71
75
  parameter_types.sort!
72
76
  end
73
77
  end
74
-
75
78
  end
76
79
  end
77
80
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/cucumber_expressions/argument'
2
4
  require 'cucumber/cucumber_expressions/parameter_type'
3
5
  require 'cucumber/cucumber_expressions/tree_regexp'
@@ -5,7 +7,6 @@ require 'cucumber/cucumber_expressions/tree_regexp'
5
7
  module Cucumber
6
8
  module CucumberExpressions
7
9
  class RegularExpression
8
-
9
10
  def initialize(expression_regexp, parameter_type_registry)
10
11
  @expression_regexp = expression_regexp
11
12
  @parameter_type_registry = parameter_type_registry
@@ -23,7 +24,7 @@ module Cucumber
23
24
  nil,
24
25
  parameter_type_regexp,
25
26
  String,
26
- lambda {|*s| s[0]},
27
+ ->(*s) { s[0]},
27
28
  false,
28
29
  false
29
30
  )
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/cucumber_expressions/group_builder'
2
4
  require 'cucumber/cucumber_expressions/errors'
3
5
 
@@ -14,6 +16,7 @@ module Cucumber
14
16
  def match(s)
15
17
  match = @regexp.match(s)
16
18
  return nil if match.nil?
19
+
17
20
  group_indices = (0..match.length).to_a.to_enum
18
21
  @group_builder.build(match, group_indices)
19
22
  end
@@ -42,7 +45,7 @@ module Cucumber
42
45
  end
43
46
 
44
47
  # (?<name>X)
45
- raise CucumberExpressionError.new("Named capture groups are not supported. See https://github.com/cucumber/cucumber/issues/329")
48
+ raise CucumberExpressionError.new('Named capture groups are not supported. See https://github.com/cucumber/cucumber/issues/329')
46
49
  end
47
50
 
48
51
  private def create_group_builder(regexp)
@@ -60,9 +63,7 @@ module Cucumber
60
63
  group_start_stack.push(i)
61
64
  group_builder = GroupBuilder.new
62
65
  non_capturing = is_non_capturing(source, i)
63
- if non_capturing
64
- group_builder.set_non_capturing!
65
- end
66
+ group_builder.set_non_capturing! if non_capturing
66
67
  stack.push(group_builder)
67
68
  elsif c == ')' && !escaping && !char_class
68
69
  gb = stack.pop
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/cucumber_expressions/argument'
2
4
  require 'cucumber/cucumber_expressions/tree_regexp'
3
5
  require 'cucumber/cucumber_expressions/parameter_type_registry'
@@ -8,9 +10,9 @@ module Cucumber
8
10
  it 'exposes parameter_type' do
9
11
  tree_regexp = TreeRegexp.new(/three (.*) mice/)
10
12
  parameter_type_registry = ParameterTypeRegistry.new
11
- arguments = Argument.build(tree_regexp, "three blind mice", [parameter_type_registry.lookup_by_type_name("string")])
13
+ arguments = Argument.build(tree_regexp, 'three blind mice', [parameter_type_registry.lookup_by_type_name('string')])
12
14
  argument = arguments[0]
13
- expect(argument.parameter_type.name).to eq("string")
15
+ expect(argument.parameter_type.name).to eq('string')
14
16
  end
15
17
  end
16
18
  end
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/cucumber_expressions/parameter_type'
2
4
  require 'cucumber/cucumber_expressions/combinatorial_generated_expression_factory'
3
5
 
4
6
  module Cucumber
5
7
  module CucumberExpressions
6
-
7
8
  class Color; end
8
9
  class CssColor; end
9
10
  class Date; end
@@ -14,13 +15,13 @@ module Cucumber
14
15
  it 'generates multiple expressions' do
15
16
  parameter_type_combinations = [
16
17
  [
17
- ParameterType.new('color', /red|blue|yellow/, Color, lambda {|s| Color.new}, true, false),
18
- ParameterType.new('csscolor', /red|blue|yellow/, CssColor, lambda {|s| CssColor.new}, true, false)
18
+ ParameterType.new('color', /red|blue|yellow/, Color, ->(s) { Color.new}, true, false),
19
+ ParameterType.new('csscolor', /red|blue|yellow/, CssColor, ->(s) { CssColor.new}, true, false)
19
20
  ],
20
21
  [
21
- ParameterType.new('date', /\d{4}-\d{2}-\d{2}/, Date, lambda {|s| Date.new}, true, false),
22
- ParameterType.new('datetime', /\d{4}-\d{2}-\d{2}/, DateTime, lambda {|s| DateTime.new}, true, false),
23
- ParameterType.new('timestamp', /\d{4}-\d{2}-\d{2}/, Timestamp, lambda {|s| Timestamp.new}, true, false)
22
+ ParameterType.new('date', /\d{4}-\d{2}-\d{2}/, Date, ->(s) { Date.new}, true, false),
23
+ ParameterType.new('datetime', /\d{4}-\d{2}-\d{2}/, DateTime, ->(s) { DateTime.new}, true, false),
24
+ ParameterType.new('timestamp', /\d{4}-\d{2}-\d{2}/, Timestamp, ->(s) { Timestamp.new}, true, false)
24
25
  ]
25
26
  ]
26
27