From ad98a32cbc478b3559796b1c96b66e9f40cba414 Mon Sep 17 00:00:00 2001 From: Mike Perham Date: Fri, 16 Jun 2017 08:47:34 -0700 Subject: [PATCH] Update how delayed extensions are loaded, fixes #3509 --- Changes.md | 4 +++- lib/sidekiq/delay.rb | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Changes.md b/Changes.md index a1492be5..16c934c8 100644 --- a/Changes.md +++ b/Changes.md @@ -2,11 +2,13 @@ [Sidekiq Changes](https://github.com/mperham/sidekiq/blob/master/Changes.md) | [Sidekiq Pro Changes](https://github.com/mperham/sidekiq/blob/master/Pro-Changes.md) | [Sidekiq Enterprise Changes](https://github.com/mperham/sidekiq/blob/master/Ent-Changes.md) -HEAD +5.0.3 ----------- - Fix overriding `class_attribute` core extension from ActiveSupport with Sidekiq one [PikachuEXE, #3499] - Allow job logger to be overridden [AlfonsoUceda, #3502] +- Set a default Redis client identifier for debugging [#3516] +- Fix "Uninitialized constant" errors on startup with the delayed extensions [#3509] 5.0.2 ----------- diff --git a/lib/sidekiq/delay.rb b/lib/sidekiq/delay.rb index a3e4eeef..32e7a6e8 100644 --- a/lib/sidekiq/delay.rb +++ b/lib/sidekiq/delay.rb @@ -3,12 +3,17 @@ module Sidekiq def self.enable_delay! if defined?(::ActiveSupport) + require 'sidekiq/extensions/active_record' + require 'sidekiq/extensions/action_mailer' + + # Need to patch Psych so it can autoload classes whose names are serialized + # in the delayed YAML. + Psych::Visitors::ToRuby.prepend(Sidekiq::Extensions::PsychAutoload) + ActiveSupport.on_load(:active_record) do - require 'sidekiq/extensions/active_record' include Sidekiq::Extensions::ActiveRecord end ActiveSupport.on_load(:action_mailer) do - require 'sidekiq/extensions/action_mailer' extend Sidekiq::Extensions::ActionMailer end end @@ -17,5 +22,19 @@ module Sidekiq Module.__send__(:include, Sidekiq::Extensions::Klass) end + module PsychAutoload + def resolve_class(klass_name) + # constantize + names = klass_name.split('::') + names.shift if names.empty? || names.first.empty? + + names.inject(Object) do |constant, name| + constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name) + end + rescue NameError + super + end + end end end +