From 45e66659093eac7cd375db22969c72c41d2e8a93 Mon Sep 17 00:00:00 2001 From: Anatoly Shirykalov Date: Thu, 5 Jul 2018 17:43:31 +0300 Subject: [PATCH 1/3] code_reload --- lib/rails_admin/config.rb | 8 ++++++++ lib/rails_admin/engine.rb | 8 ++++++++ spec/rails_admin/config_spec.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/lib/rails_admin/config.rb b/lib/rails_admin/config.rb index 179d7c8002..7066f24334 100644 --- a/lib/rails_admin/config.rb +++ b/lib/rails_admin/config.rb @@ -304,6 +304,14 @@ def reset_model(model) @registry.delete(key) end + # Reset all models configuration + # Used to clear all configurations when reloading code in development. + # @see RailsAdmin::Engine + # @see RailsAdmin::Config.registry + def reset_all_models + @registry = {} + end + # Get all models that are configured as visible sorted by their weight and label. # # @see RailsAdmin::Config::Hideable diff --git a/lib/rails_admin/engine.rb b/lib/rails_admin/engine.rb index 298f13c342..d8ef714ba9 100644 --- a/lib/rails_admin/engine.rb +++ b/lib/rails_admin/engine.rb @@ -32,6 +32,14 @@ class Engine < Rails::Engine app.config.middleware.use Rack::Pjax end + initializer 'RailsAdmin reload config in development' do + unless Rails.application.config.cache_classes + ActiveSupport::Reloader.before_class_unload do |cl| + RailsAdmin::Config.reset_all_models + end + end + end + rake_tasks do Dir[File.join(File.dirname(__FILE__), '../tasks/*.rake')].each { |f| load f } end diff --git a/spec/rails_admin/config_spec.rb b/spec/rails_admin/config_spec.rb index f178601608..1928d1d603 100644 --- a/spec/rails_admin/config_spec.rb +++ b/spec/rails_admin/config_spec.rb @@ -344,6 +344,12 @@ class RecursivelyEmbedsMany end end + let(:team_config3) do + proc do + field :wins + end + end + it "allows code reloading" do Team.send(:rails_admin, &team_config) @@ -364,6 +370,26 @@ class Toggle < RailsAdmin::Config::Fields::Base Team.send(:rails_admin, &team_config2) expect(fields.map(&:name)).to match_array %i(id wins) end + + it "updates model config when reloading code" do + Team.send(:rails_admin, &team_config) + + # this simulates rails code reloading + Rails.application.config.cache_classes = false + RailsAdmin::Engine.initializers.select do |i| + i.name == "RailsAdmin reload config in development" + end.first.block.call + ActiveSupport::Reloader.new.tap do |instance| + instance.class_unload! + end + # /end + + Team.send(:rails_admin, &team_config3) + expect(fields.map(&:name)).to match_array %i(wins) + + # restore setting to previous value + Rails.application.config.cache_classes = true + end end end From ffac254df5276e40821efba27047b45e5461dd50 Mon Sep 17 00:00:00 2001 From: Anatoly Shirykalov Date: Mon, 9 Jul 2018 11:02:01 +0300 Subject: [PATCH 2/3] code_reload --- lib/rails_admin/engine.rb | 10 ++++++--- spec/rails_admin/config_spec.rb | 38 +++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/lib/rails_admin/engine.rb b/lib/rails_admin/engine.rb index d8ef714ba9..1c162d0891 100644 --- a/lib/rails_admin/engine.rb +++ b/lib/rails_admin/engine.rb @@ -33,9 +33,13 @@ class Engine < Rails::Engine end initializer 'RailsAdmin reload config in development' do - unless Rails.application.config.cache_classes - ActiveSupport::Reloader.before_class_unload do |cl| - RailsAdmin::Config.reset_all_models + if Rails.application.config.cache_classes + if defined?(ActiveSupport::Reloader) + ActiveSupport::Reloader.before_class_unload do + RailsAdmin::Config.reset_all_models + end + # else + # For Rails 4 not implemented end end end diff --git a/spec/rails_admin/config_spec.rb b/spec/rails_admin/config_spec.rb index 1928d1d603..293a1fbfa4 100644 --- a/spec/rails_admin/config_spec.rb +++ b/spec/rails_admin/config_spec.rb @@ -371,24 +371,30 @@ class Toggle < RailsAdmin::Config::Fields::Base expect(fields.map(&:name)).to match_array %i(id wins) end - it "updates model config when reloading code" do - Team.send(:rails_admin, &team_config) - - # this simulates rails code reloading - Rails.application.config.cache_classes = false - RailsAdmin::Engine.initializers.select do |i| - i.name == "RailsAdmin reload config in development" - end.first.block.call - ActiveSupport::Reloader.new.tap do |instance| - instance.class_unload! - end - # /end + it "updates model config when reloading code for rails 5" do + if defined?(ActiveSupport::Reloader) + Team.send(:rails_admin, &team_config) + + # this simulates rails code reloading + Rails.application.config.cache_classes = false + RailsAdmin::Engine.initializers.select do |i| + i.name == "RailsAdmin reload config in development" + end.first.block.call + if defined?(ActiveSupport::Reloader) + ActiveSupport::Reloader.new.tap(&:class_unload!) + # else + # for Rails 4 not imlemented yet + end + # /end - Team.send(:rails_admin, &team_config3) - expect(fields.map(&:name)).to match_array %i(wins) + Team.send(:rails_admin, &team_config3) + expect(fields.map(&:name)).to match_array %i(wins) - # restore setting to previous value - Rails.application.config.cache_classes = true + # restore setting to previous value + Rails.application.config.cache_classes = true + # else + # pending "for Rails 4 not implemented" + end end end end From 347f145791a6c9010c2265224f63dec61205f860 Mon Sep 17 00:00:00 2001 From: Anatoly Shirykalov Date: Mon, 16 Jul 2018 13:14:20 +0300 Subject: [PATCH 3/3] code_reload --- spec/rails_admin/config_spec.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/rails_admin/config_spec.rb b/spec/rails_admin/config_spec.rb index 293a1fbfa4..a9900d430a 100644 --- a/spec/rails_admin/config_spec.rb +++ b/spec/rails_admin/config_spec.rb @@ -381,7 +381,9 @@ class Toggle < RailsAdmin::Config::Fields::Base i.name == "RailsAdmin reload config in development" end.first.block.call if defined?(ActiveSupport::Reloader) - ActiveSupport::Reloader.new.tap(&:class_unload!) + Rails.application.executor.wrap do + ActiveSupport::Reloader.new.tap(&:class_unload!).complete! + end # else # for Rails 4 not imlemented yet end