factory_bot_factory 0.0.5 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a5446b4470b7e8fb666695ea54aecc662725ccbab46afc1425b19feb4a2f996
4
- data.tar.gz: 3dbffe0f96d8135c177e9f78fd25506c8bdcb0c89a37fc423d2b045f2df819ed
3
+ metadata.gz: fb075f366c70f4ed151ae1bc3239053c613a1a90dd0c015800c851b7f2286902
4
+ data.tar.gz: a3591e0ba67af0a20320b668e0a07de7b49e2a02d988aa82011cde91b7ef8d44
5
5
  SHA512:
6
- metadata.gz: 768c46d1e6981210d158ee455bc590bd3e4743f05fc58f9f9d99955ae6a0f41d80bd897f1b5eba4333c4e1b1db0a18973ea7a9f0e5a75913699131d134e0a0d4
7
- data.tar.gz: 5adf7eba8856308b52c77d3734189bd0d2bc8c10327bab60b63570514055c90577ca981088d281e80a72c839696ced6866339b5a752ee88a6aa92d0f1a36fe5a
6
+ metadata.gz: a3a637beb971c843d05c64e2af01c3b9a05689bb61ad634cf870ce31538a6a54f717c9206e1be631db6c0b1b22e15c91d821254d5a8a6abf5f5d57b5eea8a48b
7
+ data.tar.gz: f64f65b6cc2f269ba47c9e95a8833ec720acffd36c9fefd1b18265782563f477fb85fb73bc0d656582d55b57e7f1eb2a23158cd222c26e1bbaf35e8e6aefdd84
data/Gemfile.lock CHANGED
@@ -1,11 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- factory_bot_factory (0.0.3)
4
+ factory_bot_factory (1.2.0)
5
+ factory_bot (>= 4.8.2)
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
8
9
  specs:
10
+ activemodel (6.1.4.1)
11
+ activesupport (= 6.1.4.1)
12
+ activerecord (6.1.4.1)
13
+ activemodel (= 6.1.4.1)
14
+ activesupport (= 6.1.4.1)
9
15
  activesupport (6.1.4.1)
10
16
  concurrent-ruby (~> 1.0, >= 1.0.2)
11
17
  i18n (>= 1.6, < 2)
@@ -26,7 +32,7 @@ GEM
26
32
  pry (0.13.1)
27
33
  coderay (~> 1.1)
28
34
  method_source (~> 1.0)
29
- rake (10.5.0)
35
+ rake (13.0.6)
30
36
  rspec (3.10.0)
31
37
  rspec-core (~> 3.10.0)
32
38
  rspec-expectations (~> 3.10.0)
@@ -40,6 +46,7 @@ GEM
40
46
  diff-lcs (>= 1.2.0, < 2.0)
41
47
  rspec-support (~> 3.10.0)
42
48
  rspec-support (3.10.2)
49
+ sqlite3 (1.4.2)
43
50
  tzinfo (2.0.4)
44
51
  concurrent-ruby (~> 1.0)
45
52
  zeitwerk (2.4.2)
@@ -48,13 +55,14 @@ PLATFORMS
48
55
  ruby
49
56
 
50
57
  DEPENDENCIES
51
- bundler (~> 1.17)
52
- factory_bot
58
+ activerecord (> 5.0.0.1)
59
+ bundler (>= 2.2.10)
53
60
  factory_bot_factory!
54
61
  faker
55
62
  pry (~> 0.13.1)
56
- rake (~> 10.0)
63
+ rake (>= 11.2.2)
57
64
  rspec (~> 3.0)
65
+ sqlite3
58
66
 
59
67
  BUNDLED WITH
60
- 1.17.3
68
+ 2.2.27
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # Factory Bot Factory
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/factory_bot_factory.svg)](https://rubygems.org/gems/factory_bot_factory) ![Gem Version](https://app.travis-ci.com/cdragon1116/factory_bot_factory.svg?branch=main)
4
+
3
5
  A Gem that helps you generate FactoryBot's Factory file from exsiting Hash, OpenStruct or ActiveModels.
4
6
 
5
- The main purpose is to speed up the process of building big factory.
7
+ ![factory_bot_factory_speed_demo](https://user-images.githubusercontent.com/39395058/133921801-e6c2b61d-71f1-4b99-b096-a0304fdbce87.gif)
6
8
 
7
9
  ## Installation
8
10
 
@@ -12,52 +14,40 @@ gem 'factory_bot_factory'
12
14
 
13
15
  And then execute:
14
16
 
15
- $ bundle
17
+ ```
18
+ $ bundle
19
+ ```
16
20
 
17
21
  Or install it yourself as:
18
22
 
19
- $ gem install factory_bot_factory
23
+ ```
24
+ $ gem install factory_bot_factory
25
+ ```
20
26
 
21
27
 
22
28
  ## Quick Demo
23
29
 
24
- - Build a Hash Factory
25
-
26
30
  ```ruby
27
31
  require 'factory_bot_factory'
28
32
 
29
- data = { id: 1, tags: ["tag1", "tag2"], address: { country: "US" } }
30
- puts FactoryBotFactory.build("order_hash", Hash, data)
31
-
32
- # output
33
- FactoryBot.define do
34
- factory :order_hash, class: Hash do
35
- id { 1 }
36
- tags do
37
- [
38
- "tag1",
39
- "tag2"
40
- ]
41
- end
42
- address do
43
- {
44
- "country": "US"
45
- }
46
- end
47
- initialize_with { attributes }
48
- end
49
- end
33
+ puts FactoryBotFactory.build({ id: 1 })
34
+ puts FactoryBotFactory.build(OpenStruct.new(id: 1))
35
+ puts FactoryBotFactory.build(User.last)
36
+ puts FactoryBotFactory.build(User.new)
50
37
  ```
51
38
 
52
- - Nested Hash Factory
39
+
40
+ ## More Options
41
+
42
+ - `nested_level` - Build Nested Hash Factory (only support Hash and OpenStruct)
53
43
 
54
44
  ```ruby
55
45
  data = { id: 1, tags: ["tag1", "tag2"], address: { country: "US" } }
56
- puts FactoryBotFactory.build("order_hash", Hash, data, nested_level: 2)
46
+ puts FactoryBotFactory.build(data, nested_level: 2)
57
47
 
58
48
  # output
59
49
  FactoryBot.define do
60
- factory :order_hash, class: Hash do
50
+ factory :hash, class: Hash do
61
51
  id { 1 }
62
52
  tags do
63
53
  [
@@ -65,52 +55,77 @@ FactoryBot.define do
65
55
  "tag2"
66
56
  ]
67
57
  end
68
- address { build(:order_hash_address) }
58
+ address { build(:hash_address) }
69
59
  initialize_with { attributes }
70
60
  end
71
61
 
72
- factory :order_hash_address, class: Hash do
62
+ factory :hash_address, class: Hash do
73
63
  country { "US" }
74
64
  initialize_with { attributes }
75
65
  end
76
66
  end
77
67
  ```
78
68
 
79
- - Export the file somewhere
69
+ - `file_path` - Export output as file somewhere
80
70
 
81
71
  ```ruby
82
- FactoryBotFactory.build("order_hash", Hash, data, file_path: "spec/factories/order_hash.rb")
72
+ FactoryBotFactory.build(data, file_path: "spec/factories/hash.rb")
83
73
 
84
74
  require 'factory_bot'
85
75
  FactoryBot.reload
86
- FactoryBot.build(:order_hash, id: 2)
87
-
76
+ FactoryBot.build(:hash, id: 2)
88
77
  ```
89
78
 
90
- ## Supported Factories
79
+ - `factory_name` - Specify Factory Name
91
80
 
92
- - Hash
93
81
  ```ruby
94
- FactoryBotFactory.build("order_hash", Hash, data)
95
- ```
82
+ puts FactoryBotFactory.build({ id: 1 }, factory_name: 'order')
96
83
 
97
- - OpenStruct
98
- ```
99
- FactoryBotFactory.build("order_open_struct", OpenStruct, data)
84
+ # output
85
+ FactoryBot.define do
86
+ factory :order, class: Hash do
87
+ id { 1 }
88
+ initialize_with { attributes }
89
+ end
90
+ end
100
91
  ```
101
92
 
102
- - Your ActiveModel or ActiveRecord Model
93
+ - `klass` - Specify Output Data Structure: Hash, OpenStruct and your ActiveModel or ActiveRecord Model
94
+
95
+ You can convert your Hash object to OpenStruct factory.
96
+
97
+ ```ruby
98
+ puts FactoryBotFactory.build({ id: 1 }, factory_name: 'order', klass: OpenStruct)
99
+
100
+ # output
101
+ FactoryBot.define do
102
+ factory :order, class: OpenStruct do
103
+ id { 1 }
104
+ to_create {}
105
+ end
106
+ end
103
107
  ```
104
- FactoryBotFactory.build("user", User, user_instance)
108
+
109
+ ## Configuration
110
+
111
+ - Default factory path
112
+
113
+ By configuring `factory_path`, it allows file auto-generation without specifying `file_path`.
114
+
115
+ ```ruby
116
+ FactoryBotFactory.configure do |config|
117
+ config.factory_path = 'spec/factories'
118
+ end
105
119
  ```
106
120
 
107
- ## Configure your own converter
121
+ - Customize your own converter:
108
122
 
109
- - Configure
123
+ Converter should respond to `call` method and return single or array of executable values.
110
124
 
111
125
  ```ruby
112
126
  FactoryBotFactory.configure do |config|
113
- config.string_converter = Proc.new do |k, v|
127
+ config.numeric_converter = Proc.new { |k, v| 'rand(99)' }
128
+ config.string_converter = Proc.new do |k, v|
114
129
  if v.to_s.match?(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/)
115
130
  'Random.uuid()'
116
131
  elsif k.to_s.include?('name')
@@ -121,20 +136,20 @@ FactoryBotFactory.configure do |config|
121
136
  end
122
137
  end
123
138
 
124
- FactoryBotFactory.build("order_hash", Hash, { name: 'My Name', id: "de9515ee-006e-4a28-8af3-e88a5c771b93" })
139
+ FactoryBotFactory.build({ name: 'My Name', id: "de9515ee-006e-4a28-8af3-e88a5c771b93", age: 10 })
125
140
 
126
141
  # output
127
142
  FactoryBot.define do
128
- factory :order_hash, class: Hash do
143
+ factory :hash, class: Hash do
129
144
  name { Faker::Name.name }
130
145
  id { Random.uuid() }
146
+ age { rand(99) }
131
147
  initialize_with { attributes }
132
148
  end
133
149
  end
134
150
  ```
135
151
 
136
- See move converters 'lib/factory_bot_factory/config.rb'
137
-
152
+ See more converters [Here](https://github.com/cdragon1116/factory_bot_factory/blob/main/lib/factory_bot_factory/config.rb#L3-L13)
138
153
 
139
154
  ## Contributing
140
155
 
@@ -23,11 +23,15 @@ Gem::Specification.new do |spec|
23
23
  spec.bindir = "exe"
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ["lib"]
26
+ spec.required_ruby_version = '>= 1.8.6'
26
27
 
27
- spec.add_development_dependency "bundler", "~> 1.17"
28
- spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "bundler", ">= 2.2.10"
29
+ spec.add_development_dependency 'rake', '>= 11.2.2'
29
30
  spec.add_development_dependency "pry", '~> 0.13.1'
30
31
  spec.add_development_dependency "rspec", "~> 3.0"
31
- spec.add_development_dependency "factory_bot"
32
32
  spec.add_development_dependency "faker"
33
+ spec.add_development_dependency "activerecord", "> 5.0.0.1"
34
+ spec.add_development_dependency "sqlite3"
35
+
36
+ spec.add_dependency "factory_bot", '>= 4.8.2'
33
37
  end
@@ -0,0 +1,38 @@
1
+ require 'bigdecimal'
2
+ require 'date'
3
+
4
+ module FactoryBotFactory
5
+ class Attribute
6
+ attr_reader :key, :value, :options
7
+
8
+ def initialize(key, value, options = {})
9
+ @key = key
10
+ @value = value
11
+ @options = options
12
+ end
13
+
14
+ def build
15
+ options = [key, value, options]
16
+
17
+ values = if value.nil? || value == "null"
18
+ FactoryBotFactory.config.nil_converter.call(*options)
19
+ elsif value.is_a?(DateTime) || value.is_a?(Time)
20
+ FactoryBotFactory.config.date_time_converter.call(*options)
21
+ elsif value.is_a?(Date)
22
+ FactoryBotFactory.config.date_converter.call(*options)
23
+ elsif value.is_a?(String) || value.is_a?(Symbol)
24
+ FactoryBotFactory.config.string_converter.call(*options)
25
+ elsif value.is_a?(Numeric)
26
+ FactoryBotFactory.config.numeric_converter.call(*options)
27
+ elsif value.is_a?(BigDecimal)
28
+ FactoryBotFactory.config.big_decimal_converter.call(*options)
29
+ elsif value.is_a?(Hash)
30
+ FactoryBotFactory.config.hash_converter.call(*options)
31
+ elsif value.is_a?(Array)
32
+ FactoryBotFactory.config.array_converter.call(*options)
33
+ else value.is_a?(OpenStruct)
34
+ FactoryBotFactory.config.open_struct_converter.call(*options)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,23 +1,35 @@
1
1
  module FactoryBotFactory
2
2
  class Base
3
3
  class << self
4
- def build(factory_name, klass, data, options = {})
4
+ def build(data, options = {})
5
+ options[:klass] ||= data.class
6
+ options[:factory_name] ||= data.class.name.downcase
7
+
8
+ raise ArgumentError, "Unsupported data type. Supported format: Hash, OpenStruct, ActiveRecord instance." unless valid_data?(data)
5
9
  raise NestedToDeepError, 'Only support 5 nested levels' if options[:nested_level].to_i > 5
6
10
 
7
- factory(klass, data).new(options.merge(factory_name: factory_name)).generate(data)
8
- rescue => e
9
- puts "Please check your input data and make sure you pass supported type of factory."
11
+ factory(options[:klass], data).new(options).generate(data)
10
12
  end
11
13
 
12
14
  private
13
15
 
14
16
  def factory(klass, data)
15
- if data.respond_to?(:attributes) && klass == data.class
17
+ if active_record?(data) && klass == data.class
18
+ Object.const_get("FactoryBotFactory::ActiveRecordFactory")
19
+ elsif data.respond_to?(:attributes) && klass == data.class
16
20
  Object.const_get("FactoryBotFactory::ModelFactory")
17
21
  else
18
22
  Object.const_get("FactoryBotFactory::#{klass}Factory")
19
23
  end
20
24
  end
25
+
26
+ def valid_data?(data)
27
+ data.is_a?(Hash) || data.is_a?(OpenStruct) || data.respond_to?(:attributes)
28
+ end
29
+
30
+ def active_record?(data)
31
+ Object.const_defined?("ActiveRecord::Base") && data.class.is_a?(ActiveRecord::Base)
32
+ end
21
33
  end
22
34
  end
23
35
  end
@@ -3,16 +3,30 @@ module FactoryBotFactory
3
3
  DEFAULT_CONVERTERS = {
4
4
  hash_converter: Converters::HashConverter,
5
5
  string_converter: Converters::StringConverter,
6
- numertic_converter: Converters::NumericConverter,
6
+ numeric_converter: Converters::NumericConverter,
7
+ big_decimal_converter: Converters::NumericConverter,
7
8
  open_struct_converter: Converters::HashConverter,
8
- nil_converter: Converters::NilConverter
9
+ nil_converter: Converters::NilConverter,
10
+ date_time_converter: Converters::DateTimeConverter,
11
+ date_converter: Converters::StringConverter,
12
+ array_converter: Converters::HashConverter
9
13
  }
10
14
 
11
- attr_accessor :hash_converter, :string_converter, :numertic_converter, :open_struct_converter, :nil_converter
15
+ DEFAULT_OPTIONS = {
16
+ factory_path: nil,
17
+ print_output: false
18
+ }.merge(DEFAULT_CONVERTERS)
19
+
20
+ attr_accessor *DEFAULT_OPTIONS.keys
12
21
 
13
22
  def initialize(options = {})
14
- options = DEFAULT_CONVERTERS.merge(options)
23
+ options = DEFAULT_OPTIONS.merge(options)
15
24
  options.each { |k, v| instance_variable_set(:"@#{k}", v) }
16
25
  end
26
+
27
+ def factory_path=(path)
28
+ path = path[0..-2] if path&.end_with?("/")
29
+ @factory_path = path
30
+ end
17
31
  end
18
32
  end
@@ -0,0 +1,9 @@
1
+ module FactoryBotFactory
2
+ module Converters
3
+ class DateTimeConverter
4
+ def self.call(key, value, options = {})
5
+ "\"#{value}\""
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'factory_bot_factory/factories/model_factory'
2
+
3
+ module FactoryBotFactory
4
+ class ActiveRecordFactory < ModelFactory
5
+ def build_factory(name, value, level, _options = {})
6
+ super
7
+ end
8
+ end
9
+ end
@@ -1,52 +1,76 @@
1
+ require "factory_bot_factory/file_writer"
2
+
1
3
  module FactoryBotFactory
2
4
  class BaseFactory
5
+
6
+ attr_reader :file_path
7
+
3
8
  def initialize(options = {})
4
9
  @factory_name = options[:factory_name]
5
- @file_path = options[:file_path]
10
+ @file_path = build_file_path(options[:file_path])
6
11
  @nested_level = [(options[:nested_level] || 1), 5].min
7
12
  @line_writer = LineWriter.new(options)
8
13
  @factory_queue = []
9
14
  end
10
15
 
11
16
  def generate(data)
12
- output = LineWriter.wrap_definition do
13
- @factory_queue << [@factory_name, data, @nested_level]
14
- inner_output = []
15
-
16
- loop do
17
- factory_option = @factory_queue.shift
18
- inner_output += build_factory(*factory_option)
19
- break if @factory_queue.empty?
20
- inner_output << LineWriter::WHITE_SPACE
21
- end
22
-
23
- inner_output
17
+ push_to_factory_queue(@factory_name, data, @nested_level)
18
+ output = []
19
+
20
+ loop do
21
+ factory_option = @factory_queue.shift
22
+ output += build_factory(*factory_option)
23
+ break if @factory_queue.empty?
24
+ output << LineWriter::WHITE_SPACE
25
+ end
26
+
27
+ if @file_path
28
+ write_file(output)
29
+ else
30
+ output = LineWriter.wrap_definition { output }
24
31
  end
25
32
 
26
- output = output.join(LineWriter::NEW_LINE)
27
- File.open(@file_path, 'w') {|f| f.write(output) } if @file_path
28
33
  output
34
+ ensure
35
+ FactoryBot.reload if Object.const_defined?("FactoryBot")
36
+ puts(output) if FactoryBotFactory.config.print_output
29
37
  end
30
38
 
31
39
  private
32
40
 
33
- def build_factory(name, value, level)
41
+ def build_file_path(input_path = nil)
42
+ return input_path if input_path
43
+ return if FactoryBotFactory.config.factory_path.nil?
44
+ FactoryBotFactory.config.factory_path + "/#{@factory_name}.rb"
45
+ end
46
+
47
+ def write_file(output)
48
+ validate_existing_factory!
49
+ FileWriter.new(@file_path).write(output)
50
+ end
51
+
52
+ def validate_existing_factory!
53
+ return unless Object.const_defined?("FactoryBot") && FactoryBot.factories.registered?(@factory_name.to_s)
54
+ raise FactoryExistsError, "[FactoryBotFactory] Factory #{@factory_name} already exists. Please check your existing factories."
55
+ end
56
+
57
+ def build_factory(name, value, level, options)
34
58
  raise "This method should be implemented in a subclass"
35
59
  end
36
60
 
37
61
  def build_nested_attribute(name, key, value, current_level, max_level)
38
- return @line_writer.build(key, value) if current_level == max_level
62
+ return @line_writer.write(key, value) if current_level == max_level
39
63
 
40
64
  if is_key_value_pair?(value)
41
- push_to_factory_queue(name, key, value, max_level)
42
- @line_writer.build_nested_line(name, key)
65
+ push_to_factory_queue("#{name}_#{key}", value, max_level - 1)
66
+ @line_writer.write_nested_line(name, key)
43
67
  else
44
- @line_writer.build(key, value)
68
+ @line_writer.write(key, value)
45
69
  end
46
70
  end
47
71
 
48
- def push_to_factory_queue(name, key, value, max_level)
49
- @factory_queue.push(["#{name}_#{key}", value, max_level - 1])
72
+ def push_to_factory_queue(name, value, max_level, options = {})
73
+ @factory_queue.push([name, value, max_level, options])
50
74
  end
51
75
 
52
76
  def is_key_value_pair?(value)
@@ -1,6 +1,8 @@
1
+ require 'factory_bot_factory/factories/base_factory.rb'
2
+
1
3
  module FactoryBotFactory
2
4
  class HashFactory < BaseFactory
3
- def build_factory(name, value, level)
5
+ def build_factory(name, value, level, _options = {})
4
6
  output = LineWriter.wrap_factory(name, 'Hash') do
5
7
  inner_output = []
6
8
  value = value.attributes if value.respond_to?(:attributes)
@@ -1,10 +1,10 @@
1
1
  module FactoryBotFactory
2
2
  class ModelFactory < BaseFactory
3
- def build_factory(name, value, level)
3
+ def build_factory(name, value, level, _options = {})
4
4
  output = LineWriter.wrap_factory(name, value.class.name) do
5
5
  inner_output = []
6
6
  value.attributes.each do |key, value|
7
- inner_output += build_nested_attribute(value.class.name, key, value, 1, 1)
7
+ inner_output += build_nested_attribute(name, key, value, 1, 1)
8
8
  end
9
9
  inner_output
10
10
  end
@@ -1,6 +1,8 @@
1
+ require 'factory_bot_factory/factories/base_factory.rb'
2
+
1
3
  module FactoryBotFactory
2
4
  class OpenStructFactory < BaseFactory
3
- def build_factory(name, value, level)
5
+ def build_factory(name, value, level, _options = {})
4
6
  output = LineWriter.wrap_factory(name, 'OpenStruct') do
5
7
  inner_output = []
6
8
  value = value.attributes if value.respond_to?(:attributes)
@@ -0,0 +1,31 @@
1
+ require 'factory_bot_factory/logger'
2
+
3
+ module FactoryBotFactory
4
+ class FileWriter
5
+ attr_reader :file_paht, :output
6
+
7
+ def initialize(file_path)
8
+ @file_path = file_path
9
+ end
10
+
11
+ def write(output)
12
+ if File.file?(@file_path)
13
+ output = regroup_existing_lines(output)
14
+ message = "New Factory successfully write to an existing file."
15
+ else
16
+ output = LineWriter.wrap_definition { output }
17
+ message = "New Factory successfully write to a new file."
18
+ end
19
+
20
+ FactoryBot.reload if Object.const_defined?("FactoryBot")
21
+
22
+ File.open(@file_path, 'w') {|f| f.write(output) }
23
+ Logger.alert(message + "\nPlease check your file in #{@file_path}")
24
+ output
25
+ end
26
+
27
+ def regroup_existing_lines(output)
28
+ File.read(@file_path) + LineWriter::NEW_LINE + LineWriter.wrap_definition { output }
29
+ end
30
+ end
31
+ end
@@ -1,34 +1,20 @@
1
+ require "factory_bot_factory/attribute"
2
+
1
3
  module FactoryBotFactory
2
4
  class LineWriter
3
5
  NEW_LINE = "\n".freeze
4
6
  WHITE_SPACE = "\s".freeze
5
7
  INDENT_SPACE = 2
6
8
 
7
- attr_reader :hash_converter, :string_converter, :numertic_converter, :open_struct_converter, :nil_converter
8
-
9
9
  def initialize(options = {})
10
- @options = options
10
+ @options = options
11
11
  end
12
12
 
13
- def build(key, value)
14
- options = [key, value, @options]
15
-
16
- values = if value.nil? || value == "null"
17
- FactoryBotFactory.config.nil_converter.call(*options)
18
- elsif value.is_a?(String) || value.is_a?(Symbol)
19
- FactoryBotFactory.config.string_converter.call(*options)
20
- elsif value.is_a?(Numeric)
21
- FactoryBotFactory.config.numertic_converter.call(*options)
22
- elsif value.is_a?(Hash) || value.is_a?(Array)
23
- FactoryBotFactory.config.hash_converter.call(*options)
24
- else value.is_a?(OpenStruct)
25
- FactoryBotFactory.config.open_struct_converter.call(*options)
26
- end
27
-
28
- wrap_block(key, values)
13
+ def write(key, value)
14
+ wrap_block(key, Attribute.new(key, value, @options).build)
29
15
  end
30
16
 
31
- def build_nested_line(prefix, key)
17
+ def write_nested_line(prefix, key)
32
18
  ["#{key} { build(:#{prefix}_#{key}) }"]
33
19
  end
34
20
 
@@ -49,11 +35,19 @@ module FactoryBotFactory
49
35
  "#{WHITE_SPACE * INDENT_SPACE * level}#{value}"
50
36
  end
51
37
 
38
+ def indent_lines(level, value)
39
+ value.map { |s| indent(level, s) }
40
+ end
41
+
42
+ def join(lines)
43
+ lines.join(LineWriter::NEW_LINE)
44
+ end
45
+
52
46
  def wrap_definition(&_block)
53
47
  output = ["FactoryBot.define do"]
54
48
  output += yield.map { |s| indent(1, s) }
55
49
  output << "end"
56
- output
50
+ output.join(LineWriter::NEW_LINE)
57
51
  end
58
52
 
59
53
  def wrap_factory(name, target, &_block)
@@ -0,0 +1,41 @@
1
+ module FactoryBotFactory
2
+ class Logger
3
+ PREFIX = "[FactoryBotFactory Logger]".freeze
4
+
5
+ def self.alert(message)
6
+ message = message.split("\n").map { |m| "#{PREFIX} #{m}" }.join("\n")
7
+ puts ColorString.new(message).yellow
8
+ end
9
+ end
10
+ end
11
+
12
+ class ColorString < String
13
+ # colorization
14
+ def colorize(color_code)
15
+ "\e[#{color_code}m#{self}\e[0m"
16
+ end
17
+
18
+ def red
19
+ colorize(31)
20
+ end
21
+
22
+ def green
23
+ colorize(32)
24
+ end
25
+
26
+ def yellow
27
+ colorize(33)
28
+ end
29
+
30
+ def blue
31
+ colorize(34)
32
+ end
33
+
34
+ def pink
35
+ colorize(35)
36
+ end
37
+
38
+ def light_blue
39
+ colorize(36)
40
+ end
41
+ end
@@ -1,3 +1,3 @@
1
1
  module FactoryBotFactory
2
- VERSION = "0.0.5"
2
+ VERSION = "1.2.1"
3
3
  end
@@ -2,21 +2,26 @@ require "json"
2
2
  require "factory_bot_factory/version"
3
3
 
4
4
  # Load all Factories and Converters
5
- Dir.glob("#{File.dirname(__FILE__)}/factory_bot_factory/factories/*").each { |file| require(file) }
6
5
  Dir.glob("#{File.dirname(__FILE__)}/factory_bot_factory/converters/*").each { |file| require(file) }
6
+ require "factory_bot_factory/config"
7
7
 
8
- require 'factory_bot_factory/line_writer.rb'
9
8
  require 'factory_bot_factory/base.rb'
10
- require "factory_bot_factory/config"
9
+ require 'factory_bot_factory/line_writer.rb'
10
+ require 'factory_bot_factory/file_writer.rb'
11
+ Dir.glob("#{File.dirname(__FILE__)}/factory_bot_factory/factories/*").each { |file| require(file) }
12
+
11
13
 
12
14
  module FactoryBotFactory
13
15
  class Error < StandardError; end
14
16
  class NestedToDeepError < Error; end
17
+ class FileExistsError < ::FactoryBotFactory::Error; end
18
+ class FactoryExistsError < ::FactoryBotFactory::Error; end
15
19
 
16
20
  class << self
17
- def build(factory_name, klass, data, options = {})
21
+ def build(data, options = {})
18
22
  configure
19
- Base.build(factory_name, klass, data, options)
23
+
24
+ Base.build(data, options)
20
25
  end
21
26
 
22
27
  def configure
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: factory_bot_factory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - cdragon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-19 00:00:00.000000000 Z
11
+ date: 2021-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.17'
19
+ version: 2.2.10
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.17'
26
+ version: 2.2.10
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 11.2.2
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 11.2.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: factory_bot
70
+ name: faker
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,21 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: faker
84
+ name: activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">"
88
+ - !ruby/object:Gem::Version
89
+ version: 5.0.0.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">"
95
+ - !ruby/object:Gem::Version
96
+ version: 5.0.0.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ">="
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: factory_bot
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 4.8.2
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 4.8.2
97
125
  description: A Gem that generate FactoryBot's Factory file from exsiting Hash, OpenStruct
98
126
  or Models.
99
127
  email: cdragon1116@gmail.com
@@ -114,17 +142,22 @@ files:
114
142
  - bin/setup
115
143
  - factory_bot_factory.gemspec
116
144
  - lib/factory_bot_factory.rb
145
+ - lib/factory_bot_factory/attribute.rb
117
146
  - lib/factory_bot_factory/base.rb
118
147
  - lib/factory_bot_factory/config.rb
148
+ - lib/factory_bot_factory/converters/data_time_converter.rb
119
149
  - lib/factory_bot_factory/converters/hash_converter.rb
120
150
  - lib/factory_bot_factory/converters/nil_converter.rb
121
151
  - lib/factory_bot_factory/converters/numeric_converter.rb
122
152
  - lib/factory_bot_factory/converters/string_converter.rb
153
+ - lib/factory_bot_factory/factories/active_record_factory.rb
123
154
  - lib/factory_bot_factory/factories/base_factory.rb
124
155
  - lib/factory_bot_factory/factories/hash_factory.rb
125
156
  - lib/factory_bot_factory/factories/model_factory.rb
126
157
  - lib/factory_bot_factory/factories/open_struct_factory.rb
158
+ - lib/factory_bot_factory/file_writer.rb
127
159
  - lib/factory_bot_factory/line_writer.rb
160
+ - lib/factory_bot_factory/logger.rb
128
161
  - lib/factory_bot_factory/version.rb
129
162
  homepage: https://github.com/cdragon1116/factory_bot_factory
130
163
  licenses:
@@ -138,7 +171,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
138
171
  requirements:
139
172
  - - ">="
140
173
  - !ruby/object:Gem::Version
141
- version: '0'
174
+ version: 1.8.6
142
175
  required_rubygems_version: !ruby/object:Gem::Requirement
143
176
  requirements:
144
177
  - - ">="