diff --git a/lib/jsonapi/rails/configuration.rb b/lib/jsonapi/rails/configuration.rb new file mode 100644 index 0000000..acf4ec6 --- /dev/null +++ b/lib/jsonapi/rails/configuration.rb @@ -0,0 +1,19 @@ +module JSONAPI + module Rails + class Configuration < ActiveSupport::InheritableOptions; end + + DEFAULT_CONFIG = { + register_parameter_parser: true, + register_mime_type: true, + register_renderers: true + }.freeze + + def self.configure + yield config + end + + def self.config + @config ||= JSONAPI::Rails::Configuration.new(DEFAULT_CONFIG) + end + end +end diff --git a/lib/jsonapi/rails/railtie.rb b/lib/jsonapi/rails/railtie.rb index 0e9f723..4c94094 100644 --- a/lib/jsonapi/rails/railtie.rb +++ b/lib/jsonapi/rails/railtie.rb @@ -2,9 +2,10 @@ require 'action_controller' require 'active_support' +require 'jsonapi/rails/configuration' +require 'jsonapi/rails/controller' require 'jsonapi/rails/parser' require 'jsonapi/rails/renderer' -require 'jsonapi/rails/controller' module JSONAPI module Rails @@ -19,20 +20,26 @@ class Railtie < ::Rails::Railtie ActiveSupport.on_load(:action_controller) do include ::JSONAPI::Rails::Controller - Mime::Type.register MEDIA_TYPE, :jsonapi + if JSONAPI::Rails.config.register_mime_type + Mime::Type.register MEDIA_TYPE, :jsonapi + end - if ::Rails::VERSION::MAJOR >= 5 - ::ActionDispatch::Request.parameter_parsers[:jsonapi] = PARSER - else - ::ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime[:jsonapi]] = PARSER + if JSONAPI::Rails.config.register_parameter_parser + if ::Rails::VERSION::MAJOR >= 5 + ::ActionDispatch::Request.parameter_parsers[:jsonapi] = PARSER + else + ::ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime[:jsonapi]] = PARSER + end end - RENDERERS.each do |name, renderer| - ::ActionController::Renderers.add(name) do |resources, options| - # Renderer proc is evaluated in the controller context. - self.content_type ||= Mime[:jsonapi] + if JSONAPI::Rails.config.register_renderers + RENDERERS.each do |name, renderer| + ::ActionController::Renderers.add(name) do |resources, options| + # Renderer proc is evaluated in the controller context. + self.content_type ||= Mime[:jsonapi] - renderer.render(resources, options, self).to_json + renderer.render(resources, options, self).to_json + end end end end diff --git a/spec/config_spec.rb b/spec/config_spec.rb new file mode 100644 index 0000000..67ec9c3 --- /dev/null +++ b/spec/config_spec.rb @@ -0,0 +1,39 @@ +require 'rails_helper' + +describe JSONAPI::Rails.config do + context 'when the default configuration is used' do + it 'should register the jsonapi parameter parser' do + expect(JSONAPI::Rails.config.register_parameter_parser).to be true + end + + it 'should register the jsonapi mime type' do + expect(JSONAPI::Rails.config.register_mime_type).to be true + end + + it 'should register the jsonapi renderers' do + expect(JSONAPI::Rails.config.register_renderers).to be true + end + end + + context 'when a custom configuration is used' do + before do + JSONAPI::Rails.configure do |config| + config.register_parameter_parser = false + config.register_mime_type = false + config.register_renderers = false + end + end + + it 'should not register the jsonapi parameter parser' do + expect(JSONAPI::Rails.config.register_parameter_parser).to be false + end + + it 'should not register the jsonapi mime type' do + expect(JSONAPI::Rails.config.register_mime_type).to be false + end + + it 'should not register the jsonapi renderers' do + expect(JSONAPI::Rails.config.register_renderers).to be false + end + end +end