From 135c059d6f0664991f158d358a4312e550ead7a6 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 16 Apr 2015 14:55:32 -0300 Subject: Add config.api_only option to application and remove appropriate middleware when true --- railties/lib/rails/application/configuration.rb | 3 ++- railties/lib/rails/application/default_middleware_stack.rb | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index 78a47fcda9..6ffbb1b204 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -13,7 +13,7 @@ module Rails :railties_order, :relative_url_root, :secret_key_base, :secret_token, :serve_static_files, :ssl_options, :static_cache_control, :static_index, :session_options, :time_zone, :reload_classes_only_on_change, - :beginning_of_week, :filter_redirect, :x + :beginning_of_week, :filter_redirect, :api_only, :x attr_writer :log_level attr_reader :encoding @@ -49,6 +49,7 @@ module Rails @eager_load = nil @secret_token = nil @secret_key_base = nil + @api_only = false @x = Custom.new end diff --git a/railties/lib/rails/application/default_middleware_stack.rb b/railties/lib/rails/application/default_middleware_stack.rb index 909ed5cc35..6f9ccec137 100644 --- a/railties/lib/rails/application/default_middleware_stack.rb +++ b/railties/lib/rails/application/default_middleware_stack.rb @@ -28,7 +28,7 @@ module Rails middleware.use ::Rack::Lock unless allow_concurrency? middleware.use ::Rack::Runtime - middleware.use ::Rack::MethodOverride + middleware.use ::Rack::MethodOverride unless config.api_only middleware.use ::ActionDispatch::RequestId # Must come after Rack::MethodOverride to properly log overridden methods @@ -42,9 +42,9 @@ module Rails end middleware.use ::ActionDispatch::Callbacks - middleware.use ::ActionDispatch::Cookies + middleware.use ::ActionDispatch::Cookies unless config.api_only - if config.session_store + if !config.api_only && config.session_store if config.force_ssl && !config.session_options.key?(:secure) config.session_options[:secure] = true end -- cgit v1.2.3 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 ++-- railties/lib/rails/generators/rails/app/app_generator.rb | 7 +++++-- .../app/templates/app/controllers/application_controller.rb.tt | 4 +++- 4 files changed, 11 insertions(+), 5 deletions(-) (limited to 'railties/lib') 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 -- cgit v1.2.3 From c09a401660058606109291d1f1763e8cd13bdb4b Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 17 Apr 2015 11:51:15 -0300 Subject: Generate appropriate initializers for an api app --- railties/lib/rails/generators/rails/app/app_generator.rb | 11 +++++++++++ .../app/templates/config/initializers/wrap_parameters.rb.tt | 2 ++ 2 files changed, 13 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 6197b85bb6..d05fb55212 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -188,6 +188,10 @@ module Rails if !options[:skip_active_record] && !DATABASES.include?(options[:database]) raise Error, "Invalid value for --database option. Supported for preconfiguration are: #{DATABASES.join(", ")}." end + + # Force sprockets to be skipped when generating http only app. + # Can't modify options hash as it's frozen by default. + self.options = options.merge(skip_sprockets: true).freeze if options[:api] end public_task :set_default_accessors! @@ -273,6 +277,13 @@ module Rails end end + def delete_non_api_initializers_if_api_option + if options[:api] + remove_file 'config/initializers/session_store.rb' + remove_file 'config/initializers/cookies_serializer.rb' + end + end + def finish_template build(:leftovers) end diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt index 94f612c3dd..0fc1514684 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt @@ -1,5 +1,6 @@ # Be sure to restart your server when you modify this file. +<%- unless options[:api] -%> # This file contains settings for ActionController::ParamsWrapper which # is enabled by default. @@ -7,6 +8,7 @@ ActiveSupport.on_load(:action_controller) do wrap_parameters format: [:json] if respond_to?(:wrap_parameters) end +<%- end -%> <%- unless options.skip_active_record? -%> # To enable root element in JSON for ActiveRecord objects. -- cgit v1.2.3 From e8915d098c7ed1d652b0abb0fa646770627cd60f Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 17 Apr 2015 11:59:14 -0300 Subject: api option implies skipping javascript & sprockets --- railties/lib/rails/generators/app_base.rb | 4 ++-- railties/lib/rails/generators/rails/app/app_generator.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/app_base.rb b/railties/lib/rails/generators/app_base.rb index b85bf874a6..c02b39d203 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] || options[:api] + return [] if options[:skip_sprockets] gems = [] gems << GemfileEntry.version('sass-rails', '~> 5.0', @@ -280,7 +280,7 @@ module Rails end def javascript_gemfile_entry - if options[:skip_javascript] || options[:api] + if options[:skip_javascript] [] 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 d05fb55212..d0e957037a 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -191,7 +191,7 @@ module Rails # Force sprockets to be skipped when generating http only app. # Can't modify options hash as it's frozen by default. - self.options = options.merge(skip_sprockets: true).freeze if options[:api] + self.options = options.merge(skip_sprockets: true, skip_javascript: true).freeze if options[:api] end public_task :set_default_accessors! -- cgit v1.2.3 From 1718683016c3d5487ed9ff5eca1377c295d638ed Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 17 Apr 2015 15:27:04 -0300 Subject: Do not generate app/assets directory for api apps --- railties/lib/rails/generators/rails/app/app_generator.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index d0e957037a..0c2d333b3f 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -259,6 +259,12 @@ module Rails build(:vendor) unless options[:api] end + def delete_app_assets_if_api_option + if options[:api] + remove_dir 'app/assets' + end + end + def delete_js_folder_skipping_javascript if options[:skip_javascript] remove_dir 'app/assets/javascripts' -- cgit v1.2.3 From 9b66071a3e81b1db10b969010db96f6d5434472b Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 17 Apr 2015 15:28:52 -0300 Subject: Do not generate app/helpers directory for api apps --- railties/lib/rails/generators/rails/app/app_generator.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 0c2d333b3f..f6ac0107e1 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -265,6 +265,12 @@ module Rails end end + def delete_app_helpers_if_api_option + if options[:api] + remove_dir 'app/helpers' + end + end + def delete_js_folder_skipping_javascript if options[:skip_javascript] remove_dir 'app/assets/javascripts' -- cgit v1.2.3 From 3847e485b6feddf1bcfdb856238f0bd096001193 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 17 Apr 2015 15:31:46 -0300 Subject: Do not generate app/views directory for api apps --- railties/lib/rails/generators/rails/app/app_generator.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index f6ac0107e1..e7543d7bbf 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -271,6 +271,12 @@ module Rails end end + def delete_app_views_if_api_option + if options[:api] + remove_dir 'app/views' + end + end + def delete_js_folder_skipping_javascript if options[:skip_javascript] remove_dir 'app/assets/javascripts' -- cgit v1.2.3 From 7b47e4250df86f6ecf509b2ae1a151762676c4ed Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 17 Apr 2015 15:33:15 -0300 Subject: Do not generate test/helpers directory for api apps --- railties/lib/rails/generators/rails/app/app_generator.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index e7543d7bbf..bd096d3c16 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -268,6 +268,7 @@ module Rails def delete_app_helpers_if_api_option if options[:api] remove_dir 'app/helpers' + remove_dir 'test/helpers' end end -- cgit v1.2.3 From 101df203eb8e96a398792a3e3308e93c2fd96a47 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 17 Apr 2015 20:33:43 -0300 Subject: Add api_only option to Generators --- railties/lib/rails/configuration.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/configuration.rb b/railties/lib/rails/configuration.rb index 76364cea8f..d99d27a756 100644 --- a/railties/lib/rails/configuration.rb +++ b/railties/lib/rails/configuration.rb @@ -74,7 +74,7 @@ module Rails end class Generators #:nodoc: - attr_accessor :aliases, :options, :templates, :fallbacks, :colorize_logging + attr_accessor :aliases, :options, :templates, :fallbacks, :colorize_logging, :api_only attr_reader :hidden_namespaces def initialize @@ -83,6 +83,7 @@ module Rails @fallbacks = {} @templates = [] @colorize_logging = true + @api_only = false @hidden_namespaces = [] end -- cgit v1.2.3 From c19035299a314380285addf6f269591dc648d5cf Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 17 Apr 2015 20:34:21 -0300 Subject: Hide assets, helper, css and js namespaces for api only apps --- railties/lib/rails/generators.rb | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators.rb b/railties/lib/rails/generators.rb index 96742dd2e6..b2f227595d 100644 --- a/railties/lib/rails/generators.rb +++ b/railties/lib/rails/generators.rb @@ -65,6 +65,7 @@ module Rails } def self.configure!(config) #:nodoc: + api_only! if config.api_only no_color! unless config.colorize_logging aliases.deep_merge! config.aliases options.deep_merge! config.options @@ -102,6 +103,10 @@ module Rails @fallbacks ||= {} end + def self.api_only! + hide_namespaces "assets", "helper", "css", "js" + end + # Remove the color from output. def self.no_color! Thor::Base.shell = Thor::Shell::Basic -- cgit v1.2.3 From e8100fc4e306818d5b9a5d2bfd75dcf3f44553b4 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sat, 18 Apr 2015 04:52:13 -0300 Subject: Api apps scaffold generates routes without new and edit actions --- .../generators/rails/resource_route/resource_route_generator.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb b/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb index c986f95e67..17d22768ed 100644 --- a/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb +++ b/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb @@ -1,6 +1,8 @@ module Rails module Generators class ResourceRouteGenerator < NamedBase # :nodoc: + class_option :api, type: :boolean, + desc: "Preconfigure smaller stack for API only apps" # Properly nests namespaces passed into a generator # @@ -22,7 +24,9 @@ module Rails end # inserts the primary resource - write("resources :#{file_name.pluralize}", route_length + 1) + resources = "resources :#{file_name.pluralize}" + resources << ", except: [:new, :edit]" if options.api? + write(resources, route_length + 1) # ends blocks regular_class_path.each_index do |index| -- cgit v1.2.3 From 20939b3fcc3e34850e3c4b47327eff7ccaaa8eba Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sat, 18 Apr 2015 19:53:40 -0400 Subject: config.generators.api_only = true set rails api option on generators --- railties/lib/rails/generators.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators.rb b/railties/lib/rails/generators.rb index b2f227595d..8239c9bd9e 100644 --- a/railties/lib/rails/generators.rb +++ b/railties/lib/rails/generators.rb @@ -105,6 +105,10 @@ module Rails def self.api_only! hide_namespaces "assets", "helper", "css", "js" + + options[:rails].merge!( + api: true + ) end # Remove the color from output. -- cgit v1.2.3 From d4fe23c76b3a3307830a19be28aea177e4b96987 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sun, 19 Apr 2015 18:22:14 -0400 Subject: API apps scaffold generator generates an apropriate controller --- .../scaffold_controller_generator.rb | 5 +- .../templates/api_controller.rb | 63 ++++++++++++++++++++++ .../test_unit/scaffold/scaffold_generator.rb | 6 ++- .../scaffold/templates/api_functional_test.rb | 41 ++++++++++++++ 4 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb create mode 100644 railties/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb b/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb index c01b82884d..cd0f9c7eef 100644 --- a/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +++ b/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb @@ -10,11 +10,14 @@ module Rails class_option :helper, type: :boolean class_option :orm, banner: "NAME", type: :string, required: true, desc: "ORM to generate the controller for" + class_option :api, type: :boolean, + desc: "Preconfigure smaller stack for API only apps" argument :attributes, type: :array, default: [], banner: "field:type field:type" def create_controller_files - template "controller.rb", File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb") + template_file = options.api? ? "api_controller.rb" : "controller.rb" + template template_file, File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb") end hook_for :template_engine, :test_framework, as: :scaffold diff --git a/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb b/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb new file mode 100644 index 0000000000..ca76da6530 --- /dev/null +++ b/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb @@ -0,0 +1,63 @@ +<% if namespaced? -%> +require_dependency "<%= namespaced_file_path %>/application_controller" + +<% end -%> +<% module_namespacing do -%> +class <%= controller_class_name %>Controller < ApplicationController + before_action :set_<%= singular_table_name %>, only: [:show, :update, :destroy] + + # GET <%= route_url %> + def index + @<%= plural_table_name %> = <%= orm_class.all(class_name) %> + + render json: <%= "@#{plural_table_name}" %> + end + + # GET <%= route_url %>/1 + def show + render json: <%= "@#{singular_table_name}" %> + end + + # POST <%= route_url %> + def create + @<%= singular_table_name %> = <%= orm_class.build(class_name, "#{singular_table_name}_params") %> + + if @<%= orm_instance.save %> + render json: <%= "@#{singular_table_name}" %>, status: :created, location: <%= "@#{singular_table_name}" %> + else + render json: <%= "@#{orm_instance.errors}" %>, status: :unprocessable_entity + end + end + + # PATCH/PUT <%= route_url %>/1 + def update + if @<%= orm_instance.update("#{singular_table_name}_params") %> + head :no_content + else + render json: <%= "@#{orm_instance.errors}" %>, status: :unprocessable_entity + end + end + + # DELETE <%= route_url %>/1 + def destroy + @<%= orm_instance.destroy %> + + head :no_content + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_<%= singular_table_name %> + @<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %> + end + + # Only allow a trusted parameter "white list" through. + def <%= "#{singular_table_name}_params" %> + <%- if attributes_names.empty? -%> + params[:<%= singular_table_name %>] + <%- else -%> + params.require(:<%= singular_table_name %>).permit(<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>) + <%- end -%> + end +end +<% end -%> diff --git a/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb b/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb index c36a64db31..31be3180e8 100644 --- a/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +++ b/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb @@ -8,10 +8,14 @@ module TestUnit # :nodoc: check_class_collision suffix: "ControllerTest" + class_option :api, type: :boolean, + desc: "Preconfigure smaller stack for API only apps" + argument :attributes, type: :array, default: [], banner: "field:type field:type" def create_test_files - template "functional_test.rb", + template_file = options.api? ? "api_functional_test.rb" : "functional_test.rb" + template template_file, File.join("test/controllers", controller_class_path, "#{controller_file_name}_controller_test.rb") end diff --git a/railties/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb b/railties/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb new file mode 100644 index 0000000000..423437bba1 --- /dev/null +++ b/railties/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb @@ -0,0 +1,41 @@ +require 'test_helper' + +<% module_namespacing do -%> +class <%= controller_class_name %>ControllerTest < ActionController::TestCase + setup do + @<%= singular_table_name %> = <%= table_name %>(:one) + end + + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:<%= table_name %>) + end + + test "should create <%= singular_table_name %>" do + assert_difference('<%= class_name %>.count') do + post :create, params: { <%= "#{singular_table_name}: { #{attributes_hash} }" %> } + end + + assert_response 201 + end + + test "should show <%= singular_table_name %>" do + get :show, params: { id: <%= "@#{singular_table_name}" %> } + assert_response :success + end + + test "should update <%= singular_table_name %>" do + patch :update, params: { id: <%= "@#{singular_table_name}" %>, <%= "#{singular_table_name}: { #{attributes_hash} }" %> } + assert_response 204 + end + + test "should destroy <%= singular_table_name %>" do + assert_difference('<%= class_name %>.count', -1) do + delete :destroy, params: { id: <%= "@#{singular_table_name}" %> } + end + + assert_response 204 + end +end +<% end -%> -- cgit v1.2.3 From 6d2b405a4e4f6e076dfda11438efc5d21b1ff2a2 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sun, 19 Apr 2015 20:23:19 -0400 Subject: Api apps scaffold does not generate views --- railties/lib/rails/generators.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators.rb b/railties/lib/rails/generators.rb index 8239c9bd9e..0f99df4f57 100644 --- a/railties/lib/rails/generators.rb +++ b/railties/lib/rails/generators.rb @@ -107,7 +107,8 @@ module Rails hide_namespaces "assets", "helper", "css", "js" options[:rails].merge!( - api: true + api: true, + template_engine: nil ) end -- cgit v1.2.3 From e5b6188b47c811c94b7626a8ec42d946367b3c03 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sun, 19 Apr 2015 21:17:24 -0400 Subject: Api apps scaffold does not generate helpers --- railties/lib/rails/generators.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators.rb b/railties/lib/rails/generators.rb index 0f99df4f57..9ff0e47aea 100644 --- a/railties/lib/rails/generators.rb +++ b/railties/lib/rails/generators.rb @@ -108,6 +108,7 @@ module Rails options[:rails].merge!( api: true, + helper: false, template_engine: nil ) end -- cgit v1.2.3 From 94fdba9c92b233d3f5e9314266aabe51b51bb3e4 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sun, 19 Apr 2015 21:15:39 -0400 Subject: Api apps scaffold does not generate assets --- railties/lib/rails/generators.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators.rb b/railties/lib/rails/generators.rb index 9ff0e47aea..68d2a121fd 100644 --- a/railties/lib/rails/generators.rb +++ b/railties/lib/rails/generators.rb @@ -108,6 +108,7 @@ module Rails options[:rails].merge!( api: true, + assets: false, helper: false, template_engine: nil ) -- cgit v1.2.3 From decc4e8f82c11c71068aa513db7f17268650f7c3 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sun, 19 Apr 2015 21:29:58 -0400 Subject: Do not generate lib/assets directory for api apps --- railties/lib/rails/generators/rails/app/app_generator.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index bd096d3c16..4ad78137f0 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -262,6 +262,7 @@ module Rails def delete_app_assets_if_api_option if options[:api] remove_dir 'app/assets' + remove_dir 'lib/assets' end end -- cgit v1.2.3 From 98a9936228f8a9485131b58a728aaae5ed2dde42 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Mon, 20 Apr 2015 12:28:23 -0400 Subject: config.api_only = true implies config.generators.api_only = true --- railties/lib/rails/application/configuration.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index 6ffbb1b204..4fc7a1db62 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -13,10 +13,10 @@ module Rails :railties_order, :relative_url_root, :secret_key_base, :secret_token, :serve_static_files, :ssl_options, :static_cache_control, :static_index, :session_options, :time_zone, :reload_classes_only_on_change, - :beginning_of_week, :filter_redirect, :api_only, :x + :beginning_of_week, :filter_redirect, :x attr_writer :log_level - attr_reader :encoding + attr_reader :encoding, :api_only def initialize(*) super @@ -61,6 +61,11 @@ module Rails end end + def api_only=(value) + @api_only = value + generators.api_only = value + end + def paths @paths ||= begin paths = super -- cgit v1.2.3 From e9e94c1d1540ebca77125f0f6beb6fdec2201242 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Mon, 20 Apr 2015 12:35:08 -0400 Subject: Add config.api_only = true to config/application.rb when using rails new --api --- .../lib/rails/generators/rails/app/templates/config/application.rb | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/templates/config/application.rb b/railties/lib/rails/generators/rails/app/templates/config/application.rb index a2661bfb51..6b7d7abd0b 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/application.rb +++ b/railties/lib/rails/generators/rails/app/templates/config/application.rb @@ -32,5 +32,12 @@ module <%= app_const_base %> # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de +<%- if options[:api] -%> + + # Only loads a smaller set of middleware suitable for API only apps. + # Middleware like session, flash, cookies can be added back manually. + # Skip views, helpers and assets when generating a new resource. + config.api_only = true +<%- end -%> end end -- cgit v1.2.3 From 3d3730040dba728912a42cd6a571042833f93cee Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Mon, 20 Apr 2015 20:12:43 -0400 Subject: Disable jbuilder for Rails API apps, meanwhile it doesn't play nicely --- railties/lib/rails/generators/app_base.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/app_base.rb b/railties/lib/rails/generators/app_base.rb index c02b39d203..249fe96772 100644 --- a/railties/lib/rails/generators/app_base.rb +++ b/railties/lib/rails/generators/app_base.rb @@ -266,6 +266,8 @@ module Rails end def jbuilder_gemfile_entry + return [] if options[:api] + comment = 'Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder' GemfileEntry.version('jbuilder', '~> 2.0', comment) end -- cgit v1.2.3 From 674dab30bc46d63875c533f4cd4daa2b62ad67c5 Mon Sep 17 00:00:00 2001 From: Jorge Bejar Date: Mon, 4 May 2015 17:04:15 -0300 Subject: Routes resources avoid :new and :edit endpoints if api_only is enabled --- .../rails/generators/rails/resource_route/resource_route_generator.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb b/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb index 17d22768ed..7472e5f071 100644 --- a/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb +++ b/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb @@ -24,9 +24,7 @@ module Rails end # inserts the primary resource - resources = "resources :#{file_name.pluralize}" - resources << ", except: [:new, :edit]" if options.api? - write(resources, route_length + 1) + write("resources :#{file_name.pluralize}", route_length + 1) # ends blocks regular_class_path.each_index do |index| -- cgit v1.2.3 From fa11f10c948fde0a580acf4668849664c8ae95c6 Mon Sep 17 00:00:00 2001 From: Jorge Bejar Date: Tue, 5 May 2015 15:01:47 -0300 Subject: Api only apps should include tmp and vendor folders --- railties/lib/rails/generators/rails/app/app_generator.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 4ad78137f0..6d35fc61f0 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -252,17 +252,19 @@ module Rails end def create_tmp_files - build(:tmp) unless options[:api] + build(:tmp) end def create_vendor_files - build(:vendor) unless options[:api] + build(:vendor) end def delete_app_assets_if_api_option if options[:api] remove_dir 'app/assets' remove_dir 'lib/assets' + remove_dir 'tmp/cache/assets' + remove_dir 'vendor/assets' end end -- cgit v1.2.3 From b6c270fb62a3ee7c89200084df7666347b787717 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Wed, 13 May 2015 16:28:25 -0300 Subject: Remove unneeded option from ResourceRouteGenerator --- .../rails/generators/rails/resource_route/resource_route_generator.rb | 3 --- 1 file changed, 3 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb b/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb index 7472e5f071..42705107ae 100644 --- a/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb +++ b/railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb @@ -1,9 +1,6 @@ module Rails module Generators class ResourceRouteGenerator < NamedBase # :nodoc: - class_option :api, type: :boolean, - desc: "Preconfigure smaller stack for API only apps" - # Properly nests namespaces passed into a generator # # $ rails generate resource admin/users/products -- cgit v1.2.3 From 846f35203db958b0730018e23c30d9feaee3aa27 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Wed, 13 May 2015 16:33:33 -0300 Subject: Fix class_option description for api generators --- .../rails/scaffold_controller/scaffold_controller_generator.rb | 2 +- railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb b/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb index cd0f9c7eef..d0b8cad896 100644 --- a/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +++ b/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb @@ -11,7 +11,7 @@ module Rails class_option :orm, banner: "NAME", type: :string, required: true, desc: "ORM to generate the controller for" class_option :api, type: :boolean, - desc: "Preconfigure smaller stack for API only apps" + desc: "Generates API controller" argument :attributes, type: :array, default: [], banner: "field:type field:type" diff --git a/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb b/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb index 31be3180e8..d634584beb 100644 --- a/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +++ b/railties/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb @@ -9,7 +9,7 @@ module TestUnit # :nodoc: check_class_collision suffix: "ControllerTest" class_option :api, type: :boolean, - desc: "Preconfigure smaller stack for API only apps" + desc: "Generates API functional tests" argument :attributes, type: :array, default: [], banner: "field:type field:type" -- cgit v1.2.3 From 511c33a157464aa2b6476f26f66df6b7a1a4003e Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 14 May 2015 17:17:41 -0300 Subject: Add AMS 0.10.0.rc1 by default for api apps --- railties/lib/rails/generators/rails/app/templates/Gemfile | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/templates/Gemfile b/railties/lib/rails/generators/rails/app/templates/Gemfile index 29203b9c37..cf811503be 100644 --- a/railties/lib/rails/generators/rails/app/templates/Gemfile +++ b/railties/lib/rails/generators/rails/app/templates/Gemfile @@ -21,6 +21,11 @@ source 'https://rubygems.org' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development +<%- if options.api? -%> +# Use ActiveModelSerializers to serialize JSON responses +gem 'active_model_serializers', '~> 0.10.0.rc1' + +<%- end -%> <% if RUBY_ENGINE == 'ruby' -%> group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console -- cgit v1.2.3 From 03b576ee06ec5fe9f980dfa07c16cdbbadd7d6e2 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 14 May 2015 18:16:08 -0300 Subject: http only => API only --- railties/lib/rails/generators/rails/app/app_generator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 6d35fc61f0..4b73313388 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -189,7 +189,7 @@ module Rails raise Error, "Invalid value for --database option. Supported for preconfiguration are: #{DATABASES.join(", ")}." end - # Force sprockets to be skipped when generating http only app. + # Force sprockets to be skipped when generating API only apps. # Can't modify options hash as it's frozen by default. self.options = options.merge(skip_sprockets: true, skip_javascript: true).freeze if options[:api] end -- cgit v1.2.3 From 37507d3b837308915748c05cca8b8d41c0b469f9 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 14 May 2015 18:17:20 -0300 Subject: Document Generators.api_only! method --- railties/lib/rails/generators.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators.rb b/railties/lib/rails/generators.rb index 68d2a121fd..b430cf1909 100644 --- a/railties/lib/rails/generators.rb +++ b/railties/lib/rails/generators.rb @@ -103,6 +103,10 @@ module Rails @fallbacks ||= {} end + # Configure generators for API only applications. It basically hides + # everything that is usually browser related, such as assets and session + # migration generators, and completely disable views, helpers and assets + # so generators such as scaffold won't create them. def self.api_only! hide_namespaces "assets", "helper", "css", "js" -- cgit v1.2.3 From 72d0784611af76dd0bb3154a662c6ec14a022f4c Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 15 May 2015 11:28:52 -0300 Subject: Make Rails API apps return the full resource on update --- .../generators/rails/scaffold_controller/templates/api_controller.rb | 2 +- .../generators/test_unit/scaffold/templates/api_functional_test.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb b/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb index ca76da6530..695b7cc90b 100644 --- a/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb +++ b/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb @@ -32,7 +32,7 @@ class <%= controller_class_name %>Controller < ApplicationController # PATCH/PUT <%= route_url %>/1 def update if @<%= orm_instance.update("#{singular_table_name}_params") %> - head :no_content + render json: <%= "@#{singular_table_name}" %> else render json: <%= "@#{orm_instance.errors}" %>, status: :unprocessable_entity end diff --git a/railties/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb b/railties/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb index 423437bba1..7e41162d47 100644 --- a/railties/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb +++ b/railties/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb @@ -27,7 +27,7 @@ class <%= controller_class_name %>ControllerTest < ActionController::TestCase test "should update <%= singular_table_name %>" do patch :update, params: { id: <%= "@#{singular_table_name}" %>, <%= "#{singular_table_name}: { #{attributes_hash} }" %> } - assert_response 204 + assert_response 200 end test "should destroy <%= singular_table_name %>" do -- cgit v1.2.3 From ebcc15ca4ea22f8ace57a5251ceb8de4b917cd90 Mon Sep 17 00:00:00 2001 From: Jorge Bejar Date: Wed, 27 May 2015 21:10:29 -0300 Subject: Add rake-cors gem (commented) in Gemfile for rails api apps --- railties/lib/rails/generators/rails/app/templates/Gemfile | 3 +++ .../rails/app/templates/config/initializers/cors.rb | 14 ++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 railties/lib/rails/generators/rails/app/templates/config/initializers/cors.rb (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/templates/Gemfile b/railties/lib/rails/generators/rails/app/templates/Gemfile index cf811503be..606f1d4f96 100644 --- a/railties/lib/rails/generators/rails/app/templates/Gemfile +++ b/railties/lib/rails/generators/rails/app/templates/Gemfile @@ -25,6 +25,9 @@ source 'https://rubygems.org' # Use ActiveModelSerializers to serialize JSON responses gem 'active_model_serializers', '~> 0.10.0.rc1' +# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible +# gem 'rack-cors' + <%- end -%> <% if RUBY_ENGINE == 'ruby' -%> group :development, :test do diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/cors.rb b/railties/lib/rails/generators/rails/app/templates/config/initializers/cors.rb new file mode 100644 index 0000000000..45c44d24f8 --- /dev/null +++ b/railties/lib/rails/generators/rails/app/templates/config/initializers/cors.rb @@ -0,0 +1,14 @@ +# Avoid CORS issues when API is called from the frontend app +# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests + +# Read more: https://github.com/cyu/rack-cors + +# Rails.application.config.middleware.insert_before 0, "Rack::Cors" do +# allow do +# origins 'example.com' +# +# resource '*', +# headers: :any, +# methods: [:get, :post, :put, :patch, :delete, :options, :head] +# end +# end -- cgit v1.2.3 From cf9f2f329a589a7867b395fbc0274a90a40c9b6f Mon Sep 17 00:00:00 2001 From: Jorge Bejar Date: Tue, 2 Jun 2015 15:54:07 -0300 Subject: Enable wrap_parameter by default in rails api applications --- .../rails/app/templates/config/initializers/wrap_parameters.rb.tt | 2 -- 1 file changed, 2 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt index 0fc1514684..94f612c3dd 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt @@ -1,6 +1,5 @@ # Be sure to restart your server when you modify this file. -<%- unless options[:api] -%> # This file contains settings for ActionController::ParamsWrapper which # is enabled by default. @@ -8,7 +7,6 @@ ActiveSupport.on_load(:action_controller) do wrap_parameters format: [:json] if respond_to?(:wrap_parameters) end -<%- end -%> <%- unless options.skip_active_record? -%> # To enable root element in JSON for ActiveRecord objects. -- cgit v1.2.3 From afc78e72b4fdf940bdd747c7f8461d562ab6bb73 Mon Sep 17 00:00:00 2001 From: Jorge Bejar Date: Tue, 2 Jun 2015 15:55:26 -0300 Subject: Checking if controller responds to wrap_parameter is not longer required --- .../rails/app/templates/config/initializers/wrap_parameters.rb.tt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt index 94f612c3dd..cadc85cfac 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt @@ -5,7 +5,7 @@ # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. ActiveSupport.on_load(:action_controller) do - wrap_parameters format: [:json] if respond_to?(:wrap_parameters) + wrap_parameters format: [:json] end <%- unless options.skip_active_record? -%> -- cgit v1.2.3 From 51d5d6252ee093d3fa004abec79319ae8b4c42c4 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Mon, 8 Jun 2015 14:07:53 -0300 Subject: head :no_content is implicitly called --- .../generators/rails/scaffold_controller/templates/api_controller.rb | 2 -- 1 file changed, 2 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb b/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb index 695b7cc90b..bc3c9b3f6b 100644 --- a/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb +++ b/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb @@ -41,8 +41,6 @@ class <%= controller_class_name %>Controller < ApplicationController # DELETE <%= route_url %>/1 def destroy @<%= orm_instance.destroy %> - - head :no_content end private -- cgit v1.2.3