From 2a9cf48a615d39b932f0323d158e935a0300f7c4 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 16 Apr 2015 18:28:40 -0300 Subject: rails new --api generates an api app skeleton --- railties/lib/rails/generators.rb | 1 + railties/lib/rails/generators/app_base.rb | 4 +- .../rails/generators/rails/app/app_generator.rb | 7 +- .../app/controllers/application_controller.rb.tt | 4 +- railties/test/generators/api_app_generator_test.rb | 76 ++++++++++++++++++++++ 5 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 railties/test/generators/api_app_generator_test.rb (limited to 'railties') diff --git a/railties/lib/rails/generators.rb b/railties/lib/rails/generators.rb index 79088bbe3c..96742dd2e6 100644 --- a/railties/lib/rails/generators.rb +++ b/railties/lib/rails/generators.rb @@ -45,6 +45,7 @@ module Rails DEFAULT_OPTIONS = { rails: { + api: false, assets: true, force_plural: false, helper: true, diff --git a/railties/lib/rails/generators/app_base.rb b/railties/lib/rails/generators/app_base.rb index c02b39d203..b85bf874a6 100644 --- a/railties/lib/rails/generators/app_base.rb +++ b/railties/lib/rails/generators/app_base.rb @@ -252,7 +252,7 @@ module Rails end def assets_gemfile_entry - return [] if options[:skip_sprockets] + return [] if options[:skip_sprockets] || options[:api] gems = [] gems << GemfileEntry.version('sass-rails', '~> 5.0', @@ -280,7 +280,7 @@ module Rails end def javascript_gemfile_entry - if options[:skip_javascript] + if options[:skip_javascript] || options[:api] [] else gems = [coffee_gemfile_entry, javascript_runtime_gemfile_entry] diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 152c26860e..6197b85bb6 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -175,6 +175,9 @@ module Rails class_option :version, type: :boolean, aliases: "-v", group: :rails, desc: "Show Rails version number and quit" + class_option :api, type: :boolean, + desc: "Preconfigure smaller stack for API only apps" + def initialize(*args) super @@ -245,11 +248,11 @@ module Rails end def create_tmp_files - build(:tmp) + build(:tmp) unless options[:api] end def create_vendor_files - build(:vendor) + build(:vendor) unless options[:api] end def delete_js_folder_skipping_javascript diff --git a/railties/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt b/railties/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt index d83690e1b9..f726fd6305 100644 --- a/railties/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt @@ -1,5 +1,7 @@ -class ApplicationController < ActionController::Base +class ApplicationController < ActionController::<%= options[:api] ? "API" : "Base" %> +<%- unless options[:api] -%> # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception +<%- end -%> end diff --git a/railties/test/generators/api_app_generator_test.rb b/railties/test/generators/api_app_generator_test.rb new file mode 100644 index 0000000000..d7121da45f --- /dev/null +++ b/railties/test/generators/api_app_generator_test.rb @@ -0,0 +1,76 @@ +require 'generators/generators_test_helper' +require 'rails/generators/rails/app/app_generator' + +class ApiAppGeneratorTest < Rails::Generators::TestCase + include GeneratorsTestHelper + tests Rails::Generators::AppGenerator + + arguments [destination_root, '--api'] + + def setup + Rails.application = TestApp::Application + super + + Kernel::silence_warnings do + Thor::Base.shell.send(:attr_accessor, :always_force) + @shell = Thor::Base.shell.new + @shell.send(:always_force=, true) + end + end + + def teardown + super + Rails.application = TestApp::Application.instance + end + + def test_skeleton_is_created + run_generator + + default_files.each { |path| assert_file path } + skipped_files.each { |path| assert_no_file path } + end + + def test_api_modified_files + run_generator + + assert_file "Gemfile" do |content| + assert_no_match(/gem 'coffee-rails'/, content) + assert_no_match(/gem 'jquery-rails'/, content) + assert_no_match(/gem 'sass-rails'/, content) + end + assert_file "app/controllers/application_controller.rb", /ActionController::API/ + end + + private + + def default_files + files = %W( + .gitignore + Gemfile + Rakefile + config.ru + app/controllers + app/mailers + app/models + config/environments + config/initializers + config/locales + db + lib + lib/tasks + lib/assets + log + test/fixtures + test/controllers + test/integration + test/models + ) + files.concat %w(bin/bundle bin/rails bin/rake) + files + end + + def skipped_files + %w(vendor/assets + tmp/cache/assets) + end +end -- cgit v1.2.3