You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
2.0 KiB
54 lines
2.0 KiB
require "rails/generators"
|
|
|
|
module QuestionsCrafter
|
|
module Generators
|
|
class QuestionsGenerator < Rails::Generators::NamedBase
|
|
source_root File.expand_path("templates", __dir__)
|
|
argument :questions, type: :array, default: [], desc: "List of questions in format name:type (types: short, long, boolean, choice)"
|
|
|
|
def create_questions_file
|
|
@parsed_questions = parse_questions(questions)
|
|
template "questions.rb.erb", "app/questions/#{file_path}.rb"
|
|
end
|
|
|
|
# Both class_name and file_path were overriden to add the "Questions" suffix if needed similar to how Rails does it for controllers
|
|
def class_name
|
|
intermediate_class_name = super
|
|
intermediate_class_name.match(/Questions$/) ? intermediate_class_name : "#{intermediate_class_name}Questions"
|
|
end
|
|
|
|
def file_path
|
|
path = super
|
|
path.match(/questions$/) ? path : "#{path}_questions"
|
|
end
|
|
|
|
private
|
|
|
|
def parse_questions(questions_array)
|
|
questions_array.map do |question_def|
|
|
name, type = question_def.split(":")
|
|
type = "string" if type.nil? || type.empty?
|
|
|
|
case type.downcase
|
|
when "string"
|
|
{ name: name, type: "string", title: name.humanize }
|
|
when "text"
|
|
{ name: name, type: "text", title: name.humanize }
|
|
when "boolean"
|
|
{ name: name, type: "boolean", title: name.humanize }
|
|
when "radio"
|
|
{ name: name, type: "radio", title: name.humanize, has_options: true }
|
|
when "integer"
|
|
{ name: name, type: "integer", title: name.humanize }
|
|
when "select"
|
|
{ name: name, type: "select", title: name.humanize, has_options: true }
|
|
when "checkbox_group"
|
|
{ name: name, type: "checkbox_group", title: name.humanize, has_options: true }
|
|
else
|
|
{ name: name, type: "string", title: name.humanize }
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|