cucumber_factory 2.1.1 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/Gemfile.cucumber-1.3.lock +1 -1
- data/Gemfile.cucumber-2.4.lock +1 -1
- data/Gemfile.cucumber-3.0.lock +1 -1
- data/Gemfile.cucumber-3.1.lock +1 -1
- data/README.md +22 -0
- data/lib/cucumber_factory.rb +1 -0
- data/lib/cucumber_factory/build_strategy.rb +5 -1
- data/lib/cucumber_factory/factory.rb +60 -24
- data/lib/cucumber_factory/update_strategy.rb +30 -0
- data/lib/cucumber_factory/version.rb +1 -1
- data/spec/cucumber_factory/steps_spec.rb +72 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95567d71e09afa59f6db5bb2722ce78eb234b473987025ca3f66b6e181cdac1e
|
4
|
+
data.tar.gz: 7b1e046852657282cb2d5b65b714d12bb65c848196c0d6c70c13f3ce231fc684
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '083f2675e4b6592ab9ee117b5080fefdeaa06f27abba833f3145b176834f37baf3e40f4ef74e90b9d91558f1034b50c7c6250d2675caeda98d52b8a794d27142'
|
7
|
+
data.tar.gz: 392e4121dc98584c1928f2e028964780f079a4a0f74d437fb6595dc6d2b9ecbbb090e9eb97f0361f9fa1059c633fb8a9de8f357d986ad0a3bd5e193e79c20bae
|
data/CHANGELOG.md
CHANGED
@@ -15,6 +15,23 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
|
|
15
15
|
|
16
16
|
-
|
17
17
|
|
18
|
+
## 2.2.0 - 2020-09-23
|
19
|
+
|
20
|
+
### Compatible changes
|
21
|
+
|
22
|
+
- A step was added that allows modifying existing records with a similar syntax to creating new records:
|
23
|
+
```cucumber
|
24
|
+
(Given "Bob" is a user)
|
25
|
+
And "Bob" has the email "foo@bar.com" and is subscribed
|
26
|
+
```
|
27
|
+
- This step will also work with doc strings or tables:
|
28
|
+
```cucumber
|
29
|
+
(Given "Bob" is a user)
|
30
|
+
And the user above has these attributes:
|
31
|
+
| name | Bob |
|
32
|
+
| email | foo@bar.com |
|
33
|
+
```
|
34
|
+
|
18
35
|
## 2.1.1 - 2020-05-20
|
19
36
|
|
20
37
|
### Compatible changes
|
data/Gemfile.cucumber-1.3.lock
CHANGED
data/Gemfile.cucumber-2.4.lock
CHANGED
data/Gemfile.cucumber-3.0.lock
CHANGED
data/Gemfile.cucumber-3.1.lock
CHANGED
data/README.md
CHANGED
@@ -24,6 +24,13 @@ Quoted strings and numbers denote attribute values:
|
|
24
24
|
Given there is a movie with the title "Sunshine" and the year 2007
|
25
25
|
```
|
26
26
|
|
27
|
+
To update an existing record, specify the record and the changes:
|
28
|
+
```
|
29
|
+
Given the movie above has the title "Sunset" and the year 2008
|
30
|
+
Given the movie "Sunrise" has the year 2009
|
31
|
+
```
|
32
|
+
A record can be specified by the `above` keyword, which uses the last created record of this class, or by any string that was used during its creation.
|
33
|
+
|
27
34
|
Setting boolean attributes
|
28
35
|
--------------------------
|
29
36
|
|
@@ -42,6 +49,13 @@ Given there is a movie which is awesome, popular and successful but not science
|
|
42
49
|
And there is a director with the income "500000" but with the account balance "-30000"
|
43
50
|
```
|
44
51
|
|
52
|
+
To update boolean attributes use the keyword `is`:
|
53
|
+
|
54
|
+
```cucumber
|
55
|
+
Given the movie above is awesome but not popular
|
56
|
+
Given the movie above has the year 1979 but is not science fiction
|
57
|
+
```
|
58
|
+
|
45
59
|
|
46
60
|
Setting many attributes with a table
|
47
61
|
------------------------------------
|
@@ -62,6 +76,14 @@ Given there is a movie with these attributes:
|
|
62
76
|
| comedy | false |
|
63
77
|
```
|
64
78
|
|
79
|
+
```cucumber
|
80
|
+
Given the movie above has these attributes:
|
81
|
+
"""
|
82
|
+
name: Sunshine
|
83
|
+
comedy: false
|
84
|
+
"""
|
85
|
+
```
|
86
|
+
|
65
87
|
Setting associations
|
66
88
|
--------------------
|
67
89
|
|
data/lib/cucumber_factory.rb
CHANGED
@@ -22,6 +22,10 @@ module CucumberFactory
|
|
22
22
|
[strategy, transient_attributes]
|
23
23
|
end
|
24
24
|
|
25
|
+
def parse_model_class(model_prose)
|
26
|
+
underscored_model_name(model_prose).camelize.constantize
|
27
|
+
end
|
28
|
+
|
25
29
|
private
|
26
30
|
|
27
31
|
def variants_from_prose(variant_prose)
|
@@ -85,7 +89,7 @@ module CucumberFactory
|
|
85
89
|
end
|
86
90
|
|
87
91
|
def alternative_strategy(model_prose, variants)
|
88
|
-
model_class =
|
92
|
+
model_class = parse_model_class(model_prose)
|
89
93
|
machinist_strategy(model_class, variants) ||
|
90
94
|
active_record_strategy(model_class) ||
|
91
95
|
ruby_object_strategy(model_class)
|
@@ -2,11 +2,14 @@ module CucumberFactory
|
|
2
2
|
module Factory
|
3
3
|
class Error < StandardError; end
|
4
4
|
|
5
|
-
ATTRIBUTES_PATTERN = '( with the .+?)?( (?:which|who|that) is .+?)?'
|
5
|
+
ATTRIBUTES_PATTERN = '( with the .+?)?( (?:which|who|that) is .+?)?' # ... with the year 1979 which is science fiction
|
6
6
|
TEXT_ATTRIBUTES_PATTERN = ' (?:with|and) these attributes:'
|
7
|
+
UPDATE_ATTR_PATTERN = '(?: (?:has|belongs to)( the .+?))?(?:(?: and| but|,)*( is .+?))?' # ... belongs to the collection "Fantasy" and is trending
|
8
|
+
TEXT_UPDATE_ATTR_PATTERN = '(?: and|,)* has these attributes:'
|
7
9
|
|
8
|
-
RECORD_PATTERN = 'there is an? (.+?)( \(.+?\))?'
|
9
|
-
NAMED_RECORD_PATTERN = '(?:"([^\"]*)"|\'([^\']*)\') is an? (.+?)( \(.+?\))?'
|
10
|
+
RECORD_PATTERN = 'there is an? (.+?)( \(.+?\))?' # Given there is a movie (comedy)
|
11
|
+
NAMED_RECORD_PATTERN = '(?:"([^\"]*)"|\'([^\']*)\') is an? (.+?)( \(.+?\))?' # Given "LotR" is a movie
|
12
|
+
RECORD_UPDATE_PATTERN = 'the (.+?) (above|".+?"|\'.+?\')' # Given the movie "LotR" ...
|
10
13
|
|
11
14
|
NAMED_RECORDS_VARIABLE = :'@named_cucumber_factory_records'
|
12
15
|
|
@@ -39,6 +42,12 @@ module CucumberFactory
|
|
39
42
|
:block => lambda { |a1, a2, a3, a4| CucumberFactory::Factory.send(:parse_creation, self, a1, a2, a3, a4) }
|
40
43
|
}
|
41
44
|
|
45
|
+
UPDATE_STEP_DESCRIPTOR = {
|
46
|
+
:kind => :And,
|
47
|
+
:pattern => /^#{RECORD_UPDATE_PATTERN}#{UPDATE_ATTR_PATTERN}$/,
|
48
|
+
:block => lambda { |a1, a2, a3, a4| CucumberFactory::Factory.send(:parse_update, self, a1, a2, a3, a4) }
|
49
|
+
}
|
50
|
+
|
42
51
|
NAMED_CREATION_STEP_DESCRIPTOR_WITH_TEXT_ATTRIBUTES = {
|
43
52
|
:kind => :Given,
|
44
53
|
:pattern => /^#{NAMED_RECORD_PATTERN}#{ATTRIBUTES_PATTERN}#{TEXT_ATTRIBUTES_PATTERN}?$/,
|
@@ -53,6 +62,13 @@ module CucumberFactory
|
|
53
62
|
:priority => true
|
54
63
|
}
|
55
64
|
|
65
|
+
UPDATE_STEP_DESCRIPTOR_WITH_TEXT_ATTRIBUTES = {
|
66
|
+
:kind => :And,
|
67
|
+
:pattern => /^#{RECORD_UPDATE_PATTERN}#{UPDATE_ATTR_PATTERN}#{TEXT_UPDATE_ATTR_PATTERN}$/,
|
68
|
+
:block => lambda { |a1, a2, a3, a4, a5| CucumberFactory::Factory.send(:parse_update, self, a1, a2, a3, a4, a5) },
|
69
|
+
:priority => true
|
70
|
+
}
|
71
|
+
|
56
72
|
class << self
|
57
73
|
|
58
74
|
def add_steps(main)
|
@@ -61,6 +77,8 @@ module CucumberFactory
|
|
61
77
|
add_step(main, CREATION_STEP_DESCRIPTOR_WITH_TEXT_ATTRIBUTES)
|
62
78
|
add_step(main, NAMED_CREATION_STEP_DESCRIPTOR_WITH_TEXT_ATTRIBUTES)
|
63
79
|
add_step(main, CLEAR_NAMED_RECORDS_STEP_DESCRIPTOR)
|
80
|
+
add_step(main, UPDATE_STEP_DESCRIPTOR)
|
81
|
+
add_step(main, UPDATE_STEP_DESCRIPTOR_WITH_TEXT_ATTRIBUTES)
|
64
82
|
end
|
65
83
|
|
66
84
|
private
|
@@ -100,8 +118,24 @@ module CucumberFactory
|
|
100
118
|
end
|
101
119
|
|
102
120
|
def parse_creation(world, raw_model, raw_variant, raw_attributes, raw_boolean_attributes, raw_multiline_attributes = nil)
|
103
|
-
build_strategy, transient_attributes = BuildStrategy.from_prose(raw_model, raw_variant)
|
121
|
+
build_strategy, transient_attributes = CucumberFactory::BuildStrategy.from_prose(raw_model, raw_variant)
|
104
122
|
model_class = build_strategy.model_class
|
123
|
+
attributes = parse_attributes(world, model_class, raw_attributes, raw_boolean_attributes, raw_multiline_attributes, transient_attributes)
|
124
|
+
record = build_strategy.create_record(attributes)
|
125
|
+
remember_record_names(world, record, attributes)
|
126
|
+
record
|
127
|
+
end
|
128
|
+
|
129
|
+
def parse_update(world, raw_model, raw_name, raw_attributes, raw_boolean_attributes, raw_multiline_attributes = nil)
|
130
|
+
model_class = CucumberFactory::BuildStrategy.parse_model_class(raw_model)
|
131
|
+
attributes = parse_attributes(world, model_class, raw_attributes, raw_boolean_attributes, raw_multiline_attributes)
|
132
|
+
record = resolve_associated_value(world, model_class, model_class, model_class, raw_name)
|
133
|
+
CucumberFactory::UpdateStrategy.new(record).assign_attributes(attributes)
|
134
|
+
remember_record_names(world, record, attributes)
|
135
|
+
record
|
136
|
+
end
|
137
|
+
|
138
|
+
def parse_attributes(world, model_class, raw_attributes, raw_boolean_attributes, raw_multiline_attributes = nil, transient_attributes = [])
|
105
139
|
attributes = {}
|
106
140
|
if raw_attributes.try(:strip).present?
|
107
141
|
raw_attribute_fragment_regex = /(?:the |and |with |but |,| )+(.*?) (#{VALUE_SCALAR}|#{VALUE_ARRAY}|#{VALUE_LAST_RECORD})/
|
@@ -140,33 +174,19 @@ module CucumberFactory
|
|
140
174
|
end
|
141
175
|
end
|
142
176
|
end
|
143
|
-
|
144
|
-
remember_record_names(world, record, attributes)
|
145
|
-
record
|
177
|
+
attributes
|
146
178
|
end
|
147
179
|
|
148
180
|
def attribute_value(world, model_class, transient_attributes, attribute, value)
|
149
181
|
associated, association_class = resolve_association(attribute, model_class, transient_attributes)
|
150
182
|
|
151
|
-
if matches_fully?(value, VALUE_ARRAY)
|
152
|
-
|
153
|
-
|
183
|
+
value = if matches_fully?(value, VALUE_ARRAY)
|
184
|
+
array_values = unquote(value).scan(VALUE_SCALAR)
|
185
|
+
array_values.map { |v| attribute_value(world, model_class, transient_attributes, attribute, v) }
|
154
186
|
elsif associated
|
155
|
-
|
156
|
-
raise(Error, "Cannot set last #{model_class}##{attribute} for polymorphic associations") unless association_class.present?
|
157
|
-
|
158
|
-
value = CucumberFactory::Switcher.find_last(association_class) || raise(Error, "There is no last #{attribute}")
|
159
|
-
elsif matches_fully?(value, VALUE_STRING)
|
160
|
-
value = unquote(value)
|
161
|
-
value = get_named_record(world, value) || transform_value(world, value)
|
162
|
-
elsif matches_fully?(value, VALUE_INTEGER)
|
163
|
-
value = value.to_s
|
164
|
-
value = get_named_record(world, value) || transform_value(world, value)
|
165
|
-
else
|
166
|
-
raise Error, "Cannot set association #{model_class}##{attribute} to #{value}."
|
167
|
-
end
|
187
|
+
resolve_associated_value(world, model_class, association_class, attribute, value)
|
168
188
|
else
|
169
|
-
|
189
|
+
resolve_scalar_value(world, model_class, attribute, value)
|
170
190
|
end
|
171
191
|
value
|
172
192
|
end
|
@@ -192,6 +212,22 @@ module CucumberFactory
|
|
192
212
|
[associated, association_class]
|
193
213
|
end
|
194
214
|
|
215
|
+
def resolve_associated_value(world, model_class, association_class, attribute, value)
|
216
|
+
if matches_fully?(value, VALUE_LAST_RECORD)
|
217
|
+
raise(Error, "Cannot set last #{model_class}##{attribute} for polymorphic associations") unless association_class.present?
|
218
|
+
|
219
|
+
CucumberFactory::Switcher.find_last(association_class) || raise(Error, "There is no last #{attribute}")
|
220
|
+
elsif matches_fully?(value, VALUE_STRING)
|
221
|
+
value = unquote(value)
|
222
|
+
get_named_record(world, value) || transform_value(world, value)
|
223
|
+
elsif matches_fully?(value, VALUE_INTEGER)
|
224
|
+
value = value.to_s
|
225
|
+
get_named_record(world, value) || transform_value(world, value)
|
226
|
+
else
|
227
|
+
raise Error, "Cannot set association #{model_class}##{attribute} to #{value}."
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
195
231
|
def resolve_scalar_value(world, model_class, attribute, value)
|
196
232
|
if matches_fully?(value, VALUE_STRING)
|
197
233
|
value = unquote(value)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module CucumberFactory
|
2
|
+
|
3
|
+
class UpdateStrategy
|
4
|
+
|
5
|
+
def initialize(record)
|
6
|
+
@record = record
|
7
|
+
end
|
8
|
+
|
9
|
+
def assign_attributes(attributes)
|
10
|
+
active_record_strategy(attributes) ||
|
11
|
+
ruby_object_strategy(attributes)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def active_record_strategy(attributes)
|
17
|
+
return unless @record.respond_to?(:save!)
|
18
|
+
|
19
|
+
CucumberFactory::Switcher.assign_attributes(@record, attributes)
|
20
|
+
@record.save!
|
21
|
+
end
|
22
|
+
|
23
|
+
def ruby_object_strategy(attributes)
|
24
|
+
attributes.each do |name, value|
|
25
|
+
@record.send("#{name}=".to_sym, value)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -111,7 +111,7 @@ describe 'steps provided by cucumber_factory' do
|
|
111
111
|
payment.id.should == 2
|
112
112
|
end
|
113
113
|
|
114
|
-
it "should allow to name records and set a belongs_to association to that record by
|
114
|
+
it "should allow to name records and set a belongs_to association to that record by referring to that name" do
|
115
115
|
invoke_cucumber_step('"Some Prequel" is a movie with the title "Before Sunrise"')
|
116
116
|
invoke_cucumber_step('there is a movie with the title "Limitless"')
|
117
117
|
invoke_cucumber_step('there is a movie with the title "Before Sunset" and the prequel "Some Prequel"')
|
@@ -120,7 +120,7 @@ describe 'steps provided by cucumber_factory' do
|
|
120
120
|
movie.prequel.should == prequel
|
121
121
|
end
|
122
122
|
|
123
|
-
it "should allow to set a belongs_to association to a previously created record by
|
123
|
+
it "should allow to set a belongs_to association to a previously created record by referring to any string attribute of that record" do
|
124
124
|
invoke_cucumber_step('there is a movie with the title "Before Sunrise"')
|
125
125
|
invoke_cucumber_step('there is a movie with the title "Limitless"')
|
126
126
|
invoke_cucumber_step('there is a movie with the title "Before Sunset" and the prequel "Before Sunrise"')
|
@@ -129,7 +129,17 @@ describe 'steps provided by cucumber_factory' do
|
|
129
129
|
movie.prequel.should == prequel
|
130
130
|
end
|
131
131
|
|
132
|
-
it "should allow to set a belongs_to association to a previously
|
132
|
+
it "should allow to set a belongs_to association to a previously updated record by referring to any string attribute used when updating" do
|
133
|
+
invoke_cucumber_step('there is a movie')
|
134
|
+
invoke_cucumber_step('the movie above has the title "Before Sunrise"')
|
135
|
+
invoke_cucumber_step('there is a movie with the title "Limitless"')
|
136
|
+
invoke_cucumber_step('there is a movie with the title "Before Sunset" and the prequel "Before Sunrise"')
|
137
|
+
movie = Movie.find_by_title!('Before Sunset')
|
138
|
+
prequel = Movie.find_by_title!('Before Sunrise')
|
139
|
+
movie.prequel.should == prequel
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should allow to set a belongs_to association to a previously created record by referring to their explicitely set primary keys" do
|
133
143
|
invoke_cucumber_step('there is a movie with the ID 123')
|
134
144
|
invoke_cucumber_step('there is a movie with the title "Before Sunset" and the prequel 123')
|
135
145
|
movie = Movie.find_by_title!('Before Sunset')
|
@@ -200,6 +210,15 @@ describe 'steps provided by cucumber_factory' do
|
|
200
210
|
user.deleted.should == true
|
201
211
|
end
|
202
212
|
|
213
|
+
it "should allow to name records and set a belongs_to association to that record by referring to that name" do
|
214
|
+
invoke_cucumber_step('"Some Prequel" is a movie with the title "Before Sunrise"')
|
215
|
+
invoke_cucumber_step('there is a movie with the title "Limitless"')
|
216
|
+
invoke_cucumber_step('there is a movie with the title "Before Sunset" and the prequel "Some Prequel"')
|
217
|
+
movie = Movie.find_by_title!('Before Sunset')
|
218
|
+
prequel = Movie.find_by_title!('Before Sunrise')
|
219
|
+
movie.prequel.should == prequel
|
220
|
+
end
|
221
|
+
|
203
222
|
it "should allow to set positive boolean attributes with 'which' after the attribute list" do
|
204
223
|
user = User.new
|
205
224
|
User.stub(:new => user)
|
@@ -259,7 +278,7 @@ describe 'steps provided by cucumber_factory' do
|
|
259
278
|
user.deleted.should == true
|
260
279
|
end
|
261
280
|
|
262
|
-
it "should allow to set a has_many association by
|
281
|
+
it "should allow to set a has_many association by referring to multiple named records in square brackets" do
|
263
282
|
invoke_cucumber_step('there is a movie with the title "Sunshine"')
|
264
283
|
invoke_cucumber_step('there is a movie with the title "Limitless"')
|
265
284
|
invoke_cucumber_step('there is a user with the reviewed movies ["Sunshine" and "Limitless"]')
|
@@ -536,5 +555,54 @@ tags: ["foo", "bar"]
|
|
536
555
|
lambda { invoke_cucumber_step("there is a machinist model with the attribute 'foo' and the ") }.should raise_error(ArgumentError, 'Unable to parse attributes " and the ".')
|
537
556
|
lambda { invoke_cucumber_step("there is a machinist model with the attribute 'foo'. the other_attribute 'bar' and the third attribute 'baz'") }.should raise_error(ArgumentError, 'Unable to parse attributes ".".')
|
538
557
|
end
|
558
|
+
|
559
|
+
it "should allow to update the last record of a type" do
|
560
|
+
invoke_cucumber_step('there is a user with the name "Bar" and the email "foo@example.com" who is not subscribed')
|
561
|
+
invoke_cucumber_step('the user above has the name "Baz", the email "foobar@example.com", and is subscribed')
|
562
|
+
user = User.last
|
563
|
+
user.name.should == 'Baz'
|
564
|
+
user.email.should == 'foobar@example.com'
|
565
|
+
user.subscribed.should == true
|
566
|
+
end
|
567
|
+
|
568
|
+
it "should be able to update a record with a given name" do
|
569
|
+
invoke_cucumber_step('"Foo" is a user with the name "Bar"')
|
570
|
+
invoke_cucumber_step('the user "Foo" has the email "foo@example.com"')
|
571
|
+
invoke_cucumber_step("the user 'Foo' is subscribed")
|
572
|
+
user = User.last
|
573
|
+
user.name.should == 'Bar'
|
574
|
+
user.email.should == 'foo@example.com'
|
575
|
+
user.subscribed.should == true
|
576
|
+
end
|
577
|
+
|
578
|
+
it "should be able to update a record with a Cucumber table expression" do
|
579
|
+
invoke_cucumber_step('"Foo" is a user with the name "Bar"')
|
580
|
+
invoke_cucumber_step('the user above has these attributes:', nil, <<-DATA_TABLE)
|
581
|
+
| name | Jane |
|
582
|
+
| locked | true |
|
583
|
+
DATA_TABLE
|
584
|
+
user = User.last
|
585
|
+
user.name.should == "Jane"
|
586
|
+
user.locked.should == true
|
587
|
+
end
|
588
|
+
|
589
|
+
it "should allow to update a record via additional data table" do
|
590
|
+
invoke_cucumber_step('"Foo" is a user with the name "Bar"')
|
591
|
+
invoke_cucumber_step('the user above has the email "test@invalid.com", is subscribed, and has these attributes:', nil, <<-DATA_TABLE)
|
592
|
+
| name | Jane |
|
593
|
+
DATA_TABLE
|
594
|
+
user = User.last
|
595
|
+
user.name.should == "Jane"
|
596
|
+
user.email.should == "test@invalid.com"
|
597
|
+
user.subscribed.should == true
|
598
|
+
end
|
599
|
+
|
600
|
+
it "should allow to update an association" do
|
601
|
+
invoke_cucumber_step('there is a movie with the title "Before Sunrise"')
|
602
|
+
invoke_cucumber_step('there is a user with the name "John"')
|
603
|
+
invoke_cucumber_step('the movie above has the reviewer above')
|
604
|
+
movie = Movie.last
|
605
|
+
movie.reviewer.name.should == "John"
|
606
|
+
end
|
539
607
|
end
|
540
608
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber_factory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henning Koch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber
|
@@ -97,6 +97,7 @@ files:
|
|
97
97
|
- lib/cucumber_factory/build_strategy.rb
|
98
98
|
- lib/cucumber_factory/factory.rb
|
99
99
|
- lib/cucumber_factory/switcher.rb
|
100
|
+
- lib/cucumber_factory/update_strategy.rb
|
100
101
|
- lib/cucumber_factory/version.rb
|
101
102
|
- spec/cucumber_factory/factory/build_strategy_spec.rb
|
102
103
|
- spec/cucumber_factory/steps_spec.rb
|