cucumber_factory 1.14.2 → 1.15.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.
- checksums.yaml +4 -4
- data/.travis.yml +11 -12
- data/CHANGELOG.md +55 -0
- data/Gemfile +1 -1
- data/{gemfiles/Gemfile.cucumber-1.3 → Gemfile.cucumber-1.3} +1 -1
- data/{gemfiles/Gemfile.cucumber-1.3.lock → Gemfile.cucumber-1.3.lock} +2 -2
- data/{gemfiles/Gemfile.cucumber-2.4 → Gemfile.cucumber-2.4} +1 -1
- data/{gemfiles/Gemfile.cucumber-2.4.lock → Gemfile.cucumber-2.4.lock} +2 -2
- data/{gemfiles/Gemfile.cucumber-3.0 → Gemfile.cucumber-3.0} +1 -1
- data/{gemfiles/Gemfile.cucumber-3.0.lock → Gemfile.cucumber-3.0.lock} +2 -2
- data/{gemfiles/Gemfile.cucumber-3.1 → Gemfile.cucumber-3.1} +1 -1
- data/{gemfiles/Gemfile.cucumber-3.1.lock → Gemfile.cucumber-3.1.lock} +2 -2
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/lib/cucumber_factory.rb +15 -1
- data/lib/cucumber_factory/add_steps.rb +1 -0
- data/lib/cucumber_factory/build_strategy.rb +108 -0
- data/lib/{cucumber → cucumber_factory}/factory.rb +9 -11
- data/lib/cucumber_factory/version.rb +1 -1
- data/spec/cucumber_factory/factory/build_strategy_spec.rb +2 -2
- data/spec/support/cucumber_helper.rb +2 -1
- metadata +14 -12
- data/lib/cucumber/factory/build_strategy.rb +0 -110
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c9be7d49c33814f02f79d18b4a92eb3f5af05de9bd8b8b0a38305e2113763e0c
|
|
4
|
+
data.tar.gz: a446cbe7440b4fb9f0841133dd655d1fd332e2eace463297d484fa40d5849ffd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2bb70ead6e5bcb857d6c887ae4b5ec5a1f0b95f93d550c1e90a45c97c2a88f16733f4abf47fa5ded2242400c2e97e40d2a6c70835439b2b273ed290831af236e
|
|
7
|
+
data.tar.gz: c5dc17e7f963b9a7c5a0e6d1e128bc5024a5e547737e4f1148e60ee47b3dbf48d7a7db5422e5481ddaae0558092cd7faaa957ea370de233bfc5bff7f94904087
|
data/.travis.yml
CHANGED
|
@@ -4,32 +4,31 @@ rvm:
|
|
|
4
4
|
- 2.5.3
|
|
5
5
|
|
|
6
6
|
gemfile:
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
7
|
+
- Gemfile.cucumber-1.3
|
|
8
|
+
- Gemfile.cucumber-2.4
|
|
9
|
+
- Gemfile.cucumber-3.0
|
|
10
|
+
- Gemfile.cucumber-3.1
|
|
11
11
|
|
|
12
12
|
matrix:
|
|
13
13
|
exclude:
|
|
14
|
-
- gemfile:
|
|
14
|
+
- gemfile: Gemfile.cucumber-3.1
|
|
15
15
|
rvm: 1.8.7
|
|
16
|
-
- gemfile:
|
|
16
|
+
- gemfile: Gemfile.cucumber-3.1
|
|
17
17
|
rvm: 2.1.10 # cucumber 3 wants ruby >= 2.2
|
|
18
|
-
- gemfile:
|
|
18
|
+
- gemfile: Gemfile.cucumber-3.0
|
|
19
19
|
rvm: 1.8.7
|
|
20
|
-
- gemfile:
|
|
20
|
+
- gemfile: Gemfile.cucumber-3.0
|
|
21
21
|
rvm: 2.1.10 # cucumber 3 wants ruby >= 2.2
|
|
22
|
-
- gemfile:
|
|
22
|
+
- gemfile: Gemfile.cucumber-2.4
|
|
23
23
|
rvm: 1.8.7
|
|
24
|
-
- gemfile:
|
|
24
|
+
- gemfile: Gemfile.cucumber-1.3
|
|
25
25
|
rvm: 2.5.3 # doesn't work with old RSpec
|
|
26
|
-
- gemfile:
|
|
26
|
+
- gemfile: Gemfile.cucumber-1.3
|
|
27
27
|
rvm: 2.1.10 # doesn't work with old RSpec
|
|
28
28
|
|
|
29
29
|
install:
|
|
30
30
|
# Replace default Travis CI bundler script with a version that doesn't
|
|
31
31
|
# explode when lockfile doesn't match recently bumped version
|
|
32
|
-
- gem update --system
|
|
33
32
|
- bundle install --no-deployment --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle}
|
|
34
33
|
|
|
35
34
|
before_script:
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## 1.15.0 - 2019-02-08
|
|
9
|
+
|
|
10
|
+
### Breaking changes
|
|
11
|
+
|
|
12
|
+
- Moved gem's code from `Cucumber` module into `CucumberFactory` module.
|
|
13
|
+
- Instead of calling `Cucumber::Factory.add_steps(self)`, `require 'cucumber_factory/add_steps'` instead.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## 1.14.2 - 2018-10-31
|
|
17
|
+
|
|
18
|
+
### Compatible changes
|
|
19
|
+
|
|
20
|
+
- Replace deprecated `Fixnum` with `Integer`
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## 1.14.1 - 2018-10-26
|
|
24
|
+
|
|
25
|
+
### Compatible changes
|
|
26
|
+
|
|
27
|
+
- Allow to refer to previously set foreign keys
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## 1.14.0 - 2018-10-26
|
|
31
|
+
|
|
32
|
+
### Compatible changes
|
|
33
|
+
|
|
34
|
+
- Allow to set numbers without quotes
|
|
35
|
+
- Support array fields out of the box
|
|
36
|
+
- Allow to set has_many associations with square bracket notation
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## 1.13.0 - 2018-04-26
|
|
40
|
+
|
|
41
|
+
### Compatible changes
|
|
42
|
+
|
|
43
|
+
- Support multi line attribute assignment
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
## 1.12.0 - 2018-04-26
|
|
47
|
+
|
|
48
|
+
### Compatible changes
|
|
49
|
+
|
|
50
|
+
- Support for Cucumber 3.0 and 3.1
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
## Previous releases
|
|
54
|
+
|
|
55
|
+
- See [GitHub](https://github.com/makandra/cucumber_factory/commits/master)
|
data/Gemfile
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
./
|
|
1
|
+
./Gemfile.cucumber-2.4
|
data/Gemfile.lock
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
./
|
|
1
|
+
./Gemfile.cucumber-2.4.lock
|
data/README.md
CHANGED
|
@@ -180,7 +180,7 @@ In your `Gemfile` say:
|
|
|
180
180
|
|
|
181
181
|
Now create a file `features/step_definitions/factory_steps.rb`, which just says
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
require 'cucumber_factory/add_steps'
|
|
184
184
|
|
|
185
185
|
Now run `bundle install` and restart your server.
|
|
186
186
|
|
data/lib/cucumber_factory.rb
CHANGED
|
@@ -12,5 +12,19 @@ end
|
|
|
12
12
|
require 'cucumber_priority'
|
|
13
13
|
|
|
14
14
|
# Gem
|
|
15
|
-
require '
|
|
15
|
+
require 'cucumber_factory/build_strategy'
|
|
16
|
+
require 'cucumber_factory/factory'
|
|
16
17
|
require 'cucumber_factory/switcher'
|
|
18
|
+
|
|
19
|
+
module Cucumber
|
|
20
|
+
module Factory
|
|
21
|
+
module_function
|
|
22
|
+
|
|
23
|
+
def add_steps(main)
|
|
24
|
+
warn "Using `Cucumber::Factory.add_steps(self)` is deprecated. Use `require 'cucumber_factory/add_steps'` instead."
|
|
25
|
+
|
|
26
|
+
add_steps_filepath = File.join(File.dirname(__FILE__), 'cucumber_factory/add_steps.rb')
|
|
27
|
+
main.instance_eval(File.read(add_steps_filepath))
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CucumberFactory::Factory.add_steps(self)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
module CucumberFactory
|
|
2
|
+
|
|
3
|
+
# wraps machinist / factory_bot / ruby object logic
|
|
4
|
+
|
|
5
|
+
class BuildStrategy
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
|
|
9
|
+
def from_prose(model_prose, variant_prose)
|
|
10
|
+
# don't use \w which depends on the system locale
|
|
11
|
+
underscored_model_name = model_prose.gsub(/[^A-Za-z0-9_\/]+/, "_")
|
|
12
|
+
if variant_prose.present?
|
|
13
|
+
variants = /\((.*?)\)/.match(variant_prose)[1].split(/\s*,\s*/)
|
|
14
|
+
variants = variants.collect { |variant| variant.downcase.gsub(" ", "_") }
|
|
15
|
+
else
|
|
16
|
+
variants = []
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if factory_bot_strategy = factory_bot_strategy(underscored_model_name, variants)
|
|
20
|
+
factory_bot_strategy
|
|
21
|
+
else
|
|
22
|
+
model_class = underscored_model_name.camelize.constantize
|
|
23
|
+
machinist_strategy(model_class, variants) ||
|
|
24
|
+
active_record_strategy(model_class) ||
|
|
25
|
+
ruby_object_strategy(model_class)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def factory_bot_strategy(factory_name, variants)
|
|
32
|
+
factory_class = ::FactoryBot if defined?(FactoryBot)
|
|
33
|
+
factory_class ||= ::FactoryGirl if defined?(FactoryGirl)
|
|
34
|
+
return unless factory_class
|
|
35
|
+
|
|
36
|
+
variants = variants.map(&:to_sym)
|
|
37
|
+
factory_name = factory_name.to_s.underscore.gsub('/', '_').to_sym
|
|
38
|
+
|
|
39
|
+
factory = factory_class.factories[factory_name]
|
|
40
|
+
|
|
41
|
+
if factory.nil? && variants.present? && factory = factory_class.factories[variants[0]]
|
|
42
|
+
factory_name, *variants = variants
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
if factory
|
|
46
|
+
new(factory.build_class) do |attributes|
|
|
47
|
+
# Cannot have additional scalar args after a varargs
|
|
48
|
+
# argument in Ruby 1.8 and 1.9
|
|
49
|
+
args = []
|
|
50
|
+
args += variants
|
|
51
|
+
args << attributes
|
|
52
|
+
factory_class.create(factory_name, *args)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def machinist_strategy(model_class, variants)
|
|
59
|
+
if model_class.respond_to?(:make)
|
|
60
|
+
|
|
61
|
+
new(model_class) do |attributes|
|
|
62
|
+
if variants.present?
|
|
63
|
+
variants.size == 1 or raise 'Machinist only supports a single variant per blueprint'
|
|
64
|
+
model_class.make(variants.first.to_sym, attributes)
|
|
65
|
+
else
|
|
66
|
+
model_class.make(attributes)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def active_record_strategy(model_class)
|
|
74
|
+
if model_class.respond_to?(:create!)
|
|
75
|
+
|
|
76
|
+
new(model_class) do |attributes|
|
|
77
|
+
model = model_class.new
|
|
78
|
+
CucumberFactory::Switcher.assign_attributes(model, attributes)
|
|
79
|
+
model.save!
|
|
80
|
+
model
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def ruby_object_strategy(model_class)
|
|
87
|
+
new(model_class) do |attributes|
|
|
88
|
+
model_class.new(attributes)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
attr_reader :model_class
|
|
96
|
+
|
|
97
|
+
def initialize(model_class, &block)
|
|
98
|
+
@model_class = model_class
|
|
99
|
+
@create_proc = block
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def create_record(attributes)
|
|
103
|
+
@create_proc.call(attributes)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
module Cucumber
|
|
4
|
-
class Factory
|
|
1
|
+
module CucumberFactory
|
|
2
|
+
module Factory
|
|
5
3
|
class Error < StandardError; end
|
|
6
4
|
|
|
7
5
|
ATTRIBUTES_PATTERN = '( with the .+?)?( (?:which|who|that) is .+?)?'
|
|
@@ -22,7 +20,7 @@ module Cucumber
|
|
|
22
20
|
|
|
23
21
|
CLEAR_NAMED_RECORDS_STEP_DESCRIPTOR = {
|
|
24
22
|
:kind => :Before,
|
|
25
|
-
:block => proc {
|
|
23
|
+
:block => proc { CucumberFactory::Factory.send(:reset_named_records, self) }
|
|
26
24
|
}
|
|
27
25
|
|
|
28
26
|
# We cannot use vararg blocks in the descriptors in Ruby 1.8, as explained by
|
|
@@ -32,26 +30,26 @@ module Cucumber
|
|
|
32
30
|
NAMED_CREATION_STEP_DESCRIPTOR = {
|
|
33
31
|
:kind => :Given,
|
|
34
32
|
:pattern => /^#{NAMED_RECORD_PATTERN}#{ATTRIBUTES_PATTERN}?$/,
|
|
35
|
-
:block => lambda { |a1, a2, a3, a4, a5|
|
|
33
|
+
:block => lambda { |a1, a2, a3, a4, a5| CucumberFactory::Factory.send(:parse_named_creation, self, a1, a2, a3, a4, a5) }
|
|
36
34
|
}
|
|
37
35
|
|
|
38
36
|
CREATION_STEP_DESCRIPTOR = {
|
|
39
37
|
:kind => :Given,
|
|
40
38
|
:pattern => /^#{RECORD_PATTERN}#{ATTRIBUTES_PATTERN}$/,
|
|
41
|
-
:block => lambda { |a1, a2, a3, a4|
|
|
39
|
+
:block => lambda { |a1, a2, a3, a4| CucumberFactory::Factory.send(:parse_creation, self, a1, a2, a3, a4) }
|
|
42
40
|
}
|
|
43
41
|
|
|
44
42
|
NAMED_CREATION_STEP_DESCRIPTOR_WITH_TEXT_ATTRIBUTES = {
|
|
45
43
|
:kind => :Given,
|
|
46
44
|
:pattern => /^"#{NAMED_RECORD_PATTERN}#{ATTRIBUTES_PATTERN}#{TEXT_ATTRIBUTES_PATTERN}?$/,
|
|
47
|
-
:block => lambda { |a1, a2, a3, a4, a5, a6|
|
|
45
|
+
:block => lambda { |a1, a2, a3, a4, a5, a6| CucumberFactory::Factory.send(:parse_named_creation, self, a1, a2, a3, a4, a5, a6) },
|
|
48
46
|
:priority => true
|
|
49
47
|
}
|
|
50
48
|
|
|
51
49
|
CREATION_STEP_DESCRIPTOR_WITH_TEXT_ATTRIBUTES = {
|
|
52
50
|
:kind => :Given,
|
|
53
51
|
:pattern => /^#{RECORD_PATTERN}#{ATTRIBUTES_PATTERN}#{TEXT_ATTRIBUTES_PATTERN}$/,
|
|
54
|
-
:block => lambda { |a1, a2, a3, a4, a5|
|
|
52
|
+
:block => lambda { |a1, a2, a3, a4, a5| CucumberFactory::Factory.send(:parse_creation, self, a1, a2, a3, a4, a5) },
|
|
55
53
|
:priority => true
|
|
56
54
|
}
|
|
57
55
|
|
|
@@ -94,12 +92,12 @@ module Cucumber
|
|
|
94
92
|
def set_named_record(world, name, record)
|
|
95
93
|
named_records(world)[name] = record
|
|
96
94
|
end
|
|
97
|
-
|
|
95
|
+
|
|
98
96
|
def parse_named_creation(world, name, raw_model, raw_variant, raw_attributes, raw_boolean_attributes, raw_multiline_attributes = nil)
|
|
99
97
|
record = parse_creation(world, raw_model, raw_variant, raw_attributes, raw_boolean_attributes, raw_multiline_attributes)
|
|
100
98
|
set_named_record(world, name, record)
|
|
101
99
|
end
|
|
102
|
-
|
|
100
|
+
|
|
103
101
|
def parse_creation(world, raw_model, raw_variant, raw_attributes, raw_boolean_attributes, raw_multiline_attributes = nil)
|
|
104
102
|
build_strategy = BuildStrategy.from_prose(raw_model, raw_variant)
|
|
105
103
|
model_class = build_strategy.model_class
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
describe
|
|
3
|
+
describe CucumberFactory::BuildStrategy do
|
|
4
4
|
|
|
5
|
-
subject {
|
|
5
|
+
subject { CucumberFactory::BuildStrategy }
|
|
6
6
|
|
|
7
7
|
# most of the behaviour is integration tested in steps_spec.rb
|
|
8
8
|
|
|
@@ -17,7 +17,8 @@ def prepare_cucumber_example
|
|
|
17
17
|
@main.extend(Cucumber::RbSupport::RbDsl)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
add_steps_filepath = File.expand_path(File.join(File.dirname(__FILE__), '../../lib/cucumber_factory/add_steps.rb'))
|
|
21
|
+
@main.instance_eval(File.read(add_steps_filepath))
|
|
21
22
|
end
|
|
22
23
|
|
|
23
24
|
def invoke_cucumber_step(step, doc_string = nil, data_table = nil)
|
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: 1.
|
|
4
|
+
version: 1.15.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:
|
|
11
|
+
date: 2019-02-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cucumber
|
|
@@ -77,23 +77,25 @@ files:
|
|
|
77
77
|
- ".rspec"
|
|
78
78
|
- ".ruby-version"
|
|
79
79
|
- ".travis.yml"
|
|
80
|
+
- CHANGELOG.md
|
|
80
81
|
- Gemfile
|
|
82
|
+
- Gemfile.cucumber-1.3
|
|
83
|
+
- Gemfile.cucumber-1.3.lock
|
|
84
|
+
- Gemfile.cucumber-2.4
|
|
85
|
+
- Gemfile.cucumber-2.4.lock
|
|
86
|
+
- Gemfile.cucumber-3.0
|
|
87
|
+
- Gemfile.cucumber-3.0.lock
|
|
88
|
+
- Gemfile.cucumber-3.1
|
|
89
|
+
- Gemfile.cucumber-3.1.lock
|
|
81
90
|
- Gemfile.lock
|
|
82
91
|
- LICENSE
|
|
83
92
|
- README.md
|
|
84
93
|
- Rakefile
|
|
85
94
|
- cucumber_factory.gemspec
|
|
86
|
-
- gemfiles/Gemfile.cucumber-1.3
|
|
87
|
-
- gemfiles/Gemfile.cucumber-1.3.lock
|
|
88
|
-
- gemfiles/Gemfile.cucumber-2.4
|
|
89
|
-
- gemfiles/Gemfile.cucumber-2.4.lock
|
|
90
|
-
- gemfiles/Gemfile.cucumber-3.0
|
|
91
|
-
- gemfiles/Gemfile.cucumber-3.0.lock
|
|
92
|
-
- gemfiles/Gemfile.cucumber-3.1
|
|
93
|
-
- gemfiles/Gemfile.cucumber-3.1.lock
|
|
94
|
-
- lib/cucumber/factory.rb
|
|
95
|
-
- lib/cucumber/factory/build_strategy.rb
|
|
96
95
|
- lib/cucumber_factory.rb
|
|
96
|
+
- lib/cucumber_factory/add_steps.rb
|
|
97
|
+
- lib/cucumber_factory/build_strategy.rb
|
|
98
|
+
- lib/cucumber_factory/factory.rb
|
|
97
99
|
- lib/cucumber_factory/switcher.rb
|
|
98
100
|
- lib/cucumber_factory/version.rb
|
|
99
101
|
- spec/cucumber_factory/factory/build_strategy_spec.rb
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
module Cucumber
|
|
2
|
-
class Factory
|
|
3
|
-
|
|
4
|
-
# wraps machinist / factory_bot / ruby object logic
|
|
5
|
-
|
|
6
|
-
class BuildStrategy
|
|
7
|
-
|
|
8
|
-
class << self
|
|
9
|
-
|
|
10
|
-
def from_prose(model_prose, variant_prose)
|
|
11
|
-
# don't use \w which depends on the system locale
|
|
12
|
-
underscored_model_name = model_prose.gsub(/[^A-Za-z0-9_\/]+/, "_")
|
|
13
|
-
if variant_prose.present?
|
|
14
|
-
variants = /\((.*?)\)/.match(variant_prose)[1].split(/\s*,\s*/)
|
|
15
|
-
variants = variants.collect { |variant| variant.downcase.gsub(" ", "_") }
|
|
16
|
-
else
|
|
17
|
-
variants = []
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
if factory_bot_strategy = factory_bot_strategy(underscored_model_name, variants)
|
|
21
|
-
factory_bot_strategy
|
|
22
|
-
else
|
|
23
|
-
model_class = underscored_model_name.camelize.constantize
|
|
24
|
-
machinist_strategy(model_class, variants) ||
|
|
25
|
-
active_record_strategy(model_class) ||
|
|
26
|
-
ruby_object_strategy(model_class)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
def factory_bot_strategy(factory_name, variants)
|
|
33
|
-
factory_class = ::FactoryBot if defined?(FactoryBot)
|
|
34
|
-
factory_class ||= ::FactoryGirl if defined?(FactoryGirl)
|
|
35
|
-
return unless factory_class
|
|
36
|
-
|
|
37
|
-
variants = variants.map(&:to_sym)
|
|
38
|
-
factory_name = factory_name.to_s.underscore.gsub('/', '_').to_sym
|
|
39
|
-
|
|
40
|
-
factory = factory_class.factories[factory_name]
|
|
41
|
-
|
|
42
|
-
if factory.nil? && variants.present? && factory = factory_class.factories[variants[0]]
|
|
43
|
-
factory_name, *variants = variants
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
if factory
|
|
47
|
-
new(factory.build_class) do |attributes|
|
|
48
|
-
# Cannot have additional scalar args after a varargs
|
|
49
|
-
# argument in Ruby 1.8 and 1.9
|
|
50
|
-
args = []
|
|
51
|
-
args += variants
|
|
52
|
-
args << attributes
|
|
53
|
-
factory_class.create(factory_name, *args)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def machinist_strategy(model_class, variants)
|
|
60
|
-
if model_class.respond_to?(:make)
|
|
61
|
-
|
|
62
|
-
new(model_class) do |attributes|
|
|
63
|
-
if variants.present?
|
|
64
|
-
variants.size == 1 or raise 'Machinist only supports a single variant per blueprint'
|
|
65
|
-
model_class.make(variants.first.to_sym, attributes)
|
|
66
|
-
else
|
|
67
|
-
model_class.make(attributes)
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def active_record_strategy(model_class)
|
|
75
|
-
if model_class.respond_to?(:create!)
|
|
76
|
-
|
|
77
|
-
new(model_class) do |attributes|
|
|
78
|
-
model = model_class.new
|
|
79
|
-
CucumberFactory::Switcher.assign_attributes(model, attributes)
|
|
80
|
-
model.save!
|
|
81
|
-
model
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def ruby_object_strategy(model_class)
|
|
88
|
-
new(model_class) do |attributes|
|
|
89
|
-
model_class.new(attributes)
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
attr_reader :model_class
|
|
97
|
-
|
|
98
|
-
def initialize(model_class, &block)
|
|
99
|
-
@model_class = model_class
|
|
100
|
-
@create_proc = block
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def create_record(attributes)
|
|
104
|
-
@create_proc.call(attributes)
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
end
|
|
110
|
-
end
|