Guest User

Untitled

a guest
Jul 21st, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. diff --git a/railties/lib/rails/configuration.rb b/railties/lib/rails/configuration.rb
  2. index 086f67a..cb32153 100644
  3. --- a/railties/lib/rails/configuration.rb
  4. +++ b/railties/lib/rails/configuration.rb
  5. @@ -1,6 +1,24 @@
  6. require 'active_support/ordered_options'
  7.  
  8. module Rails
  9. + # Create a Plugin::Options from ActiveSuppot::OrderedOptions,
  10. + # which support the following syntax:
  11. + #
  12. + # controller.action_controller.include FooBar
  13. + #
  14. + class Plugin::Options < ActiveSupport::OrderedOptions #:nodoc:
  15. + attr_reader :includes
  16. +
  17. + def initialize(*args)
  18. + @includes = []
  19. + super
  20. + end
  21. +
  22. + def include(*args)
  23. + @includes.concat(args)
  24. + end
  25. + end
  26. +
  27. # Temporarily separate the plugin configuration class from the main
  28. # configuration class while this bit is being cleaned up.
  29. class Plugin::Configuration
  30. @@ -16,7 +34,7 @@ module Rails
  31. @options = base.options.dup
  32. @middleware = base.middleware.dup
  33. else
  34. - @options = Hash.new { |h,k| h[k] = ActiveSupport::OrderedOptions.new }
  35. + @options = Hash.new { |h,k| h[k] = Rails::Plugin::Options.new }
  36. @middleware = ActionDispatch::MiddlewareStack.new
  37. end
  38. end
  39. diff --git a/railties/lib/rails/plugin.rb b/railties/lib/rails/plugin.rb
  40. index 0699aff..aa325c6 100644
  41. --- a/railties/lib/rails/plugin.rb
  42. +++ b/railties/lib/rails/plugin.rb
  43. @@ -25,6 +25,24 @@ module Rails
  44. Configuration.default
  45. end
  46.  
  47. + # Creates an initializer which includes all given modules to the given class.
  48. + #
  49. + # module Rails
  50. + # class ActionController < Rails::Plugin
  51. + # plugin_name :action_controller
  52. + # include_modules_in "ActionController::Base"
  53. + # end
  54. + # end
  55. + #
  56. + def self.include_modules_in(klass, from=plugin_name)
  57. + self.initializer :"#{from}.include_modules" do |app|
  58. + klass = klass.constantize if klass.is_a?(String)
  59. + app.config.send(from).includes.each do |mod|
  60. + klass.send(:include, mod.is_a?(String) ? mod.constantize : mod)
  61. + end
  62. + end
  63. + end
  64. +
  65. class Vendored < Plugin
  66. def self.all(list, paths)
  67. plugins = []
  68. diff --git a/railties/test/plugins/configuration_test.rb b/railties/test/plugins/configuration_test.rb
  69. index 5786316..0843d05 100644
  70. --- a/railties/test/plugins/configuration_test.rb
  71. +++ b/railties/test/plugins/configuration_test.rb
  72. @@ -8,6 +8,10 @@ module PluginsTest
  73. require "rails"
  74. end
  75.  
  76. + module Bar; end
  77. + module Baz; end
  78. + module All; end
  79. +
  80. test "config is available to plugins" do
  81. class Foo < Rails::Plugin ; end
  82. assert_nil Foo.config.action_controller.foo
  83. @@ -24,6 +28,18 @@ module PluginsTest
  84. assert_equal "hello", AppTemplate::Application.config.foo.greetings
  85. end
  86.  
  87. + test "plugin configurations allow modules to be given" do
  88. + class Foo < Rails::Plugin ; config.foo.include(Bar, Baz) ; end
  89. + assert_equal [Bar, Baz], Foo.config.foo.includes
  90. + end
  91. +
  92. + test "plugin includes given modules in given class" do
  93. + class Foo < Rails::Plugin ; config.foo.include(Bar, "PluginsTest::ConfigurationTest::Baz") ; include_modules_in All ; end
  94. + Foo.new.run_initializers(Foo)
  95. + assert All.ancestors.include?(Bar)
  96. + assert All.ancestors.include?(Baz)
  97. + end
  98. +
  99. test "plugin config merges are deep" do
  100. class Foo < Rails::Plugin ; config.foo.greetings = 'hello' ; end
  101. class MyApp < Rails::Application
Add Comment
Please, Sign In to add comment