From cbd6159b4a4b1ff73d099e1c2cc0a330a346871e Mon Sep 17 00:00:00 2001 From: Kir Shatrov Date: Fri, 5 Dec 2014 17:43:31 -0500 Subject: [PATCH] Form generator # rails generate form feedback email phone body --- .gitignore | 1 + lib/rails/generators/form/form_generator.rb | 25 ++++++++++++++++ .../form/form_install_generator.rb} | 4 +-- lib/rails/generators/form/templates/form.rb | 9 ++++++ test/generators/form_generator_test.rb | 30 +++++++++++++++++++ test/generators/install_generator_test.rb | 7 +++-- test/test_helper.rb | 2 -- 7 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 lib/rails/generators/form/form_generator.rb rename lib/{generators/active_form/install_generator.rb => rails/generators/form/form_install_generator.rb} (90%) create mode 100644 lib/rails/generators/form/templates/form.rb create mode 100644 test/generators/form_generator_test.rb diff --git a/.gitignore b/.gitignore index de5d954..24e4b0e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ test/dummy/db/*.sqlite3-journal test/dummy/log/*.log test/dummy/tmp/ test/dummy/.sass-cache +tmp diff --git a/lib/rails/generators/form/form_generator.rb b/lib/rails/generators/form/form_generator.rb new file mode 100644 index 0000000..aaf0a5f --- /dev/null +++ b/lib/rails/generators/form/form_generator.rb @@ -0,0 +1,25 @@ +require 'rails/generators' +require 'rails/generators/named_base' + +module Rails + module Generators # :nodoc: + class FormGenerator < Rails::Generators::NamedBase # :nodoc: + desc 'This generator creates an active form file at app/forms' + + check_class_collision suffix: 'Form' + + hook_for :test_framework + + argument :attributes, type: :array, default: [], banner: "field1 field2 field3" + + def self.default_generator_root + File.dirname(__FILE__) + end + + def create_job_file + template 'form.rb', File.join('app/forms', class_path, "#{file_name}_form.rb") + end + + end + end +end diff --git a/lib/generators/active_form/install_generator.rb b/lib/rails/generators/form/form_install_generator.rb similarity index 90% rename from lib/generators/active_form/install_generator.rb rename to lib/rails/generators/form/form_install_generator.rb index f839790..8b3b72e 100644 --- a/lib/generators/active_form/install_generator.rb +++ b/lib/rails/generators/form/form_install_generator.rb @@ -1,9 +1,9 @@ require 'rails/generators' require 'rails/generators/base' -module ActiveForm +module Rails module Generators - class InstallGenerator < Rails::Generators::Base + class FormInstallGenerator < Rails::Generators::Base desc "Creates a forms directory into your app and test directories and includes the necessary JS file." diff --git a/lib/rails/generators/form/templates/form.rb b/lib/rails/generators/form/templates/form.rb new file mode 100644 index 0000000..f4faaf8 --- /dev/null +++ b/lib/rails/generators/form/templates/form.rb @@ -0,0 +1,9 @@ +<% module_namespacing do -%> +class <%= class_name %>Form < ActiveForm::Base + <% if attributes.present? %> + attributes <%= attributes.map {|a| ":#{a.name}" }.join(", ") %> + <% else %> + # attributes :name, :email + <% end %> +end +<% end -%> diff --git a/test/generators/form_generator_test.rb b/test/generators/form_generator_test.rb new file mode 100644 index 0000000..105380f --- /dev/null +++ b/test/generators/form_generator_test.rb @@ -0,0 +1,30 @@ +require "rails/generators/test_case" +require 'rails/generators/form/form_generator' + +class FormGeneratorTest < Rails::Generators::TestCase + tests Rails::Generators::FormGenerator + + destination File.expand_path("../../tmp", File.dirname(__FILE__)) + setup :prepare_destination + + def test_help + content = run_generator ["--help"] + assert_match(/creates an active form file/, content) + end + + def test_form_is_created + run_generator ["inquiry"] + assert_file "app/forms/inquiry_form.rb", /class InquiryForm < ActiveForm::Base/ + end + + def test_form_with_attributes + run_generator ["feedback", "name", "email", "phone"] + assert_file "app/forms/feedback_form.rb", /class FeedbackForm < ActiveForm::Base/ + assert_file "app/forms/feedback_form.rb", /attributes :name, :email, :phone/ + end + + def test_namespaced_forms + run_generator ["admin/feedback"] + assert_file "app/forms/admin/feedback_form.rb", /class Admin::FeedbackForm < ActiveForm::Base/ + end +end diff --git a/test/generators/install_generator_test.rb b/test/generators/install_generator_test.rb index d6deaeb..b442178 100644 --- a/test/generators/install_generator_test.rb +++ b/test/generators/install_generator_test.rb @@ -1,7 +1,8 @@ -require "test_helper" +require "rails/generators/test_case" +require "rails/generators/form/form_install_generator" -class InstallGeneratorTest < Rails::Generators::TestCase - tests ActiveForm::Generators::InstallGenerator +class FormInstallGeneratorTest < Rails::Generators::TestCase + tests Rails::Generators::FormInstallGenerator destination File.expand_path("../../tmp", __FILE__) setup :prepare_destination diff --git a/test/test_helper.rb b/test/test_helper.rb index 0a565c3..c0f0c7b 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -14,5 +14,3 @@ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__) end -require "rails/generators/test_case" -require "generators/active_form/install_generator"