thoughtbot--factory_bot_rails/lib/generators/factory_bot/model/model_generator.rb

93 lines
2.0 KiB
Ruby

require "generators/factory_bot"
require "factory_bot_rails"
module FactoryBot
module Generators
class ModelGenerator < Base
argument(
:attributes,
type: :array,
default: [],
banner: "field:type field:type",
)
class_option(
:dir,
type: :string,
default: "test/factories",
desc: "The directory or file root where factories belong",
)
class_option(
:suffix,
type: :string,
default: nil,
desc: "Suffix to add factory file",
)
def create_fixture_file
if File.exist?(factories_file)
insert_factory_into_existing_file
else
create_factory_file
end
end
private
def factories_file
options[:dir] + ".rb"
end
def insert_factory_into_existing_file
insert_into_file(
factories_file,
factory_definition,
after: "FactoryBot.define do\n",
)
end
def create_factory_file
file = File.join(options[:dir], "#{filename}.rb")
template "factories.erb", file
end
def factory_definition
<<~RUBY
factory :#{factory_name}#{explicit_class_option} do
#{factory_attributes.gsub(/^/, ' ')}
end
RUBY
end
def factory_attributes
attributes.map do |attribute|
"#{attribute.name} { #{attribute.default.inspect} }"
end.join("\n")
end
def filename
if factory_bot_options[:filename_proc].present?
factory_bot_options[:filename_proc].call(table_name)
else
name = File.join(class_path, plural_name)
[name, filename_suffix].compact.join("_")
end
end
def filename_suffix
factory_bot_options[:suffix] || options[:suffix]
end
def factory_bot_options
generators.options[:factory_bot] || {}
end
def generators
FactoryBotRails::Railtie.config.app_generators
end
end
end
end