fabrication 2.20.1 → 3.0.0.beta.1
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 +5 -5
- data/README.markdown +1 -4
- data/Rakefile +8 -10
- data/lib/fabricate.rb +10 -13
- data/lib/fabrication.rb +6 -4
- data/lib/fabrication/config.rb +28 -15
- data/lib/fabrication/cucumber/step_fabricator.rb +20 -13
- data/lib/fabrication/errors/duplicate_fabricator_error.rb +5 -3
- data/lib/fabrication/errors/infinite_recursion_error.rb +5 -3
- data/lib/fabrication/errors/misplaced_fabricate_error.rb +7 -3
- data/lib/fabrication/errors/unfabricatable_error.rb +5 -4
- data/lib/fabrication/errors/unknown_fabricator_error.rb +5 -5
- data/lib/fabrication/generator/active_record.rb +18 -11
- data/lib/fabrication/generator/base.rb +89 -81
- data/lib/fabrication/generator/mongoid.rb +13 -11
- data/lib/fabrication/generator/sequel.rb +29 -27
- data/lib/fabrication/railtie.rb +1 -3
- data/lib/fabrication/schematic/attribute.rb +69 -62
- data/lib/fabrication/schematic/definition.rb +140 -134
- data/lib/fabrication/schematic/evaluator.rb +61 -54
- data/lib/fabrication/schematic/manager.rb +67 -59
- data/lib/fabrication/schematic/runner.rb +12 -9
- data/lib/fabrication/sequencer.rb +23 -22
- data/lib/fabrication/support.rb +57 -54
- data/lib/fabrication/syntax/make.rb +0 -1
- data/lib/fabrication/transform.rb +34 -36
- data/lib/fabrication/version.rb +1 -1
- data/lib/rails/generators/fabrication/cucumber_steps/cucumber_steps_generator.rb +2 -3
- data/lib/rails/generators/fabrication/cucumber_steps/templates/fabrication_steps.rb +10 -10
- data/lib/rails/generators/fabrication/model/model_generator.rb +14 -9
- data/lib/rails/generators/fabrication/model/templates/fabricator.erb +5 -1
- data/lib/tasks/defined_fabricators.rake +11 -11
- metadata +10 -12
- data/lib/fabrication/generator/data_mapper.rb +0 -17
@@ -1,39 +1,37 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
module Fabrication
|
2
|
+
class Transform
|
3
|
+
class << self
|
4
|
+
def apply_to(schematic, attributes_hash)
|
5
|
+
Fabrication.manager.load_definitions if Fabrication.manager.empty?
|
6
|
+
attributes_hash.inject({}) { |h, (k, v)| h.update(k => apply_transform(schematic, k, v)) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def clear_all
|
10
|
+
@transforms = nil
|
11
|
+
@overrides = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def define(attribute, transform)
|
15
|
+
transforms[attribute] = transform
|
16
|
+
end
|
17
|
+
|
18
|
+
def only_for(schematic, attribute, transform)
|
19
|
+
overrides[schematic] = (overrides[schematic] || {}).merge!(attribute => transform)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def overrides
|
25
|
+
@overrides ||= {}
|
26
|
+
end
|
27
|
+
|
28
|
+
def apply_transform(schematic, attribute, value)
|
29
|
+
overrides.fetch(schematic, transforms)[attribute].call(value)
|
30
|
+
end
|
31
|
+
|
32
|
+
def transforms
|
33
|
+
@transforms ||= Hash.new(->(value) { value })
|
34
|
+
end
|
8
35
|
end
|
9
|
-
|
10
|
-
def clear_all
|
11
|
-
@transforms = nil
|
12
|
-
@overrides = nil
|
13
|
-
end
|
14
|
-
|
15
|
-
def define(attribute, transform)
|
16
|
-
transforms[attribute] = transform
|
17
|
-
end
|
18
|
-
|
19
|
-
def only_for(schematic, attribute, transform)
|
20
|
-
overrides[schematic] = (overrides[schematic] || {}).merge!(attribute => transform)
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def overrides
|
26
|
-
@overrides ||= {}
|
27
|
-
end
|
28
|
-
|
29
|
-
def apply_transform(schematic, attribute, value)
|
30
|
-
overrides.fetch(schematic, transforms)[attribute].call(value)
|
31
|
-
end
|
32
|
-
|
33
|
-
def transforms
|
34
|
-
@transforms ||= Hash.new(lambda {|value| value})
|
35
|
-
end
|
36
|
-
|
37
36
|
end
|
38
|
-
|
39
37
|
end
|
data/lib/fabrication/version.rb
CHANGED
@@ -3,13 +3,12 @@ require 'rails/generators/base'
|
|
3
3
|
module Fabrication
|
4
4
|
module Generators
|
5
5
|
class CucumberStepsGenerator < Rails::Generators::Base
|
6
|
-
|
7
6
|
def generate
|
8
|
-
template 'fabrication_steps.rb',
|
7
|
+
template 'fabrication_steps.rb', 'features/step_definitions/fabrication_steps.rb'
|
9
8
|
end
|
10
9
|
|
11
10
|
def self.source_root
|
12
|
-
@
|
11
|
+
@source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
13
12
|
end
|
14
13
|
end
|
15
14
|
end
|
@@ -7,44 +7,44 @@ def with_ivars(fabricator)
|
|
7
7
|
model = @they.last.class.to_s.underscore
|
8
8
|
instance_variable_set("@#{model.pluralize}", @they)
|
9
9
|
instance_variable_set("@#{model.singularize}", @they.last)
|
10
|
-
Fabrication::Cucumber::Fabrications[model.singularize.gsub(/\W+/,'_').downcase] = @they.last
|
10
|
+
Fabrication::Cucumber::Fabrications[model.singularize.gsub(/\W+/, '_').downcase] = @they.last
|
11
11
|
end
|
12
12
|
|
13
|
-
Given
|
13
|
+
Given(/^(\d+) ([^"]*)$/) do |count, model_name|
|
14
14
|
with_ivars Fabrication::Cucumber::StepFabricator.new(model_name) do |fab|
|
15
15
|
fab.n(count.to_i)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
Given
|
19
|
+
Given(/^the following ([^"]*):$/) do |model_name, table|
|
20
20
|
with_ivars Fabrication::Cucumber::StepFabricator.new(model_name) do |fab|
|
21
21
|
fab.from_table(table)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
Given
|
26
|
-
with_ivars Fabrication::Cucumber::StepFabricator.new(child, :
|
25
|
+
Given(/^that ([^"]*) has the following ([^"]*):$/) do |parent, child, table|
|
26
|
+
with_ivars Fabrication::Cucumber::StepFabricator.new(child, parent: parent) do |fab|
|
27
27
|
fab.from_table(table)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
Given
|
32
|
-
with_ivars Fabrication::Cucumber::StepFabricator.new(child, :
|
31
|
+
Given(/^that ([^"]*) has (\d+) ([^"]*)$/) do |parent, count, child|
|
32
|
+
with_ivars Fabrication::Cucumber::StepFabricator.new(child, parent: parent) do |fab|
|
33
33
|
fab.n(count.to_i)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
Given
|
37
|
+
Given(/^(?:that|those) (.*) belongs? to that (.*)$/) do |children, parent|
|
38
38
|
with_ivars Fabrication::Cucumber::StepFabricator.new(parent) do |fab|
|
39
39
|
fab.has_many(children)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
Then
|
43
|
+
Then(/^I should see (\d+) ([^"]*) in the database$/) do |count, model_name|
|
44
44
|
expect(Fabrication::Cucumber::StepFabricator.new(model_name).klass.count).to eq(count.to_i)
|
45
45
|
end
|
46
46
|
|
47
|
-
Then
|
47
|
+
Then(/^I should see the following (.*) in the database:$/) do |model_name, table|
|
48
48
|
klass = Fabrication::Cucumber::StepFabricator.new(model_name).klass
|
49
49
|
expect(klass.where(table.rows_hash.symbolize_keys).count).to eq(1)
|
50
50
|
end
|
@@ -3,17 +3,23 @@ require 'rails/generators/named_base'
|
|
3
3
|
module Fabrication
|
4
4
|
module Generators
|
5
5
|
class ModelGenerator < Rails::Generators::NamedBase
|
6
|
-
argument :attributes, :
|
7
|
-
class_option :dir, :
|
8
|
-
|
6
|
+
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
7
|
+
class_option :dir, type: :string, default: 'spec/fabricators',
|
8
|
+
desc: 'The directory where the fabricators should go'
|
9
|
+
class_option :extension, type: :string, default: 'rb', desc: 'file extension name'
|
9
10
|
|
10
11
|
def create_fabrication_file
|
11
12
|
copy_attributes_from_model if attributes.empty?
|
12
|
-
|
13
|
+
template_file = File.join(
|
14
|
+
options[:dir],
|
15
|
+
class_path,
|
16
|
+
"#{file_name}_fabricator.#{options[:extension]}"
|
17
|
+
)
|
18
|
+
template 'fabricator.erb', template_file
|
13
19
|
end
|
14
20
|
|
15
21
|
def self.source_root
|
16
|
-
@
|
22
|
+
@source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
17
23
|
end
|
18
24
|
|
19
25
|
private
|
@@ -21,14 +27,13 @@ module Fabrication
|
|
21
27
|
def copy_attributes_from_model
|
22
28
|
model = class_name.constantize
|
23
29
|
if defined?(ActiveRecord) && model < ActiveRecord::Base
|
24
|
-
self.attributes = model.columns_hash.map
|
30
|
+
self.attributes = model.columns_hash.map do |name, column|
|
25
31
|
Rails::Generators::GeneratedAttribute.new(name, column.type)
|
26
|
-
|
32
|
+
end
|
27
33
|
end
|
28
|
-
rescue
|
34
|
+
rescue StandardError
|
29
35
|
# no table? no problem!
|
30
36
|
end
|
31
|
-
|
32
37
|
end
|
33
38
|
end
|
34
39
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
+
<% if namespaced? -%>
|
2
|
+
Fabricator(<%= ":#{singular_name}, from: '#{namespace}::#{class_name}'" %>) do
|
3
|
+
<% else -%>
|
1
4
|
Fabricator(<%= class_name.match(/::/) ? "'#{class_name}'" : ":#{singular_name}" %>) do
|
5
|
+
<% end -%>
|
2
6
|
<% width = attributes.map{|a| a.name.size }.max.to_i -%>
|
3
7
|
<% attributes.each do |attribute| -%>
|
4
8
|
<%= "%-#{width}s %s" % [attribute.name, attribute.default.inspect] %>
|
5
9
|
<% end -%>
|
6
|
-
end
|
10
|
+
end
|
@@ -1,30 +1,30 @@
|
|
1
1
|
namespace :fabrication do
|
2
|
-
desc
|
3
|
-
task :
|
2
|
+
desc 'Display all registered fabricators by class'
|
3
|
+
task list: :environment do
|
4
4
|
Fabrication.manager.load_definitions if Fabrication.manager.empty?
|
5
5
|
|
6
6
|
if Fabrication.manager.schematics.none?
|
7
|
-
puts
|
7
|
+
puts 'No fabricators found'
|
8
8
|
next
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
schematic_groups = Fabrication.manager.schematics.group_by do |_name, fabdef|
|
12
12
|
fabdef.klass.name
|
13
13
|
end
|
14
14
|
|
15
15
|
fabricators = {}
|
16
|
-
|
17
|
-
fabricators[klass] = groups.map(&:first).sort.join(
|
16
|
+
schematic_groups.sort_by { |klass, _| klass }.each do |klass, groups|
|
17
|
+
fabricators[klass] = groups.map(&:first).sort.join(', ')
|
18
18
|
end
|
19
19
|
|
20
|
-
class_width = fabricators.keys.max_by
|
21
|
-
names_width = fabricators.values.max_by
|
20
|
+
class_width = fabricators.keys.max_by(&:size).size + 3 # padding
|
21
|
+
names_width = fabricators.values.max_by(&:size).size
|
22
22
|
say = lambda do |f1, f2|
|
23
23
|
printf "%-#{class_width}s%-#{names_width}s\n", f1, f2
|
24
24
|
end
|
25
25
|
|
26
|
-
say[
|
27
|
-
puts
|
28
|
-
fabricators.each { |klass, names| say[klass,names] }
|
26
|
+
say['Class', 'Fabricator']
|
27
|
+
puts '-' * (names_width + class_width)
|
28
|
+
fabricators.each { |klass, names| say[klass, names] }
|
29
29
|
end
|
30
30
|
end
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fabrication
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Elliott
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Fabrication is an object generation framework for ActiveRecord, Mongoid,
|
14
|
-
|
14
|
+
Sequel, or any other Ruby object.
|
15
15
|
email:
|
16
16
|
- paul@codingfrontier.com
|
17
17
|
executables: []
|
@@ -32,7 +32,6 @@ files:
|
|
32
32
|
- lib/fabrication/errors/unknown_fabricator_error.rb
|
33
33
|
- lib/fabrication/generator/active_record.rb
|
34
34
|
- lib/fabrication/generator/base.rb
|
35
|
-
- lib/fabrication/generator/data_mapper.rb
|
36
35
|
- lib/fabrication/generator/mongoid.rb
|
37
36
|
- lib/fabrication/generator/sequel.rb
|
38
37
|
- lib/fabrication/railtie.rb
|
@@ -55,7 +54,7 @@ homepage: http://fabricationgem.org
|
|
55
54
|
licenses:
|
56
55
|
- MIT
|
57
56
|
metadata: {}
|
58
|
-
post_install_message:
|
57
|
+
post_install_message:
|
59
58
|
rdoc_options: []
|
60
59
|
require_paths:
|
61
60
|
- lib
|
@@ -63,16 +62,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
63
62
|
requirements:
|
64
63
|
- - ">="
|
65
64
|
- !ruby/object:Gem::Version
|
66
|
-
version: 2.
|
65
|
+
version: 2.5.0
|
67
66
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
67
|
requirements:
|
69
|
-
- - "
|
68
|
+
- - ">"
|
70
69
|
- !ruby/object:Gem::Version
|
71
|
-
version:
|
70
|
+
version: 1.3.1
|
72
71
|
requirements: []
|
73
|
-
|
74
|
-
|
75
|
-
signing_key:
|
72
|
+
rubygems_version: 3.1.4
|
73
|
+
signing_key:
|
76
74
|
specification_version: 4
|
77
75
|
summary: Implementing the factory pattern in Ruby so you don't have to.
|
78
76
|
test_files: []
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class Fabrication::Generator::DataMapper < Fabrication::Generator::Base
|
2
|
-
|
3
|
-
def self.supports?(klass)
|
4
|
-
defined?(DataMapper) && klass.ancestors.include?(DataMapper::Hook)
|
5
|
-
end
|
6
|
-
|
7
|
-
def build_instance
|
8
|
-
self._instance = _klass.new(_attributes)
|
9
|
-
end
|
10
|
-
|
11
|
-
protected
|
12
|
-
|
13
|
-
def persist
|
14
|
-
_instance.save
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|