From a7037f59c4b46d458ed6909ac468f789e76ae444 Mon Sep 17 00:00:00 2001 From: James Lamont Date: Mon, 2 Nov 2015 09:12:34 +1100 Subject: [PATCH 1/4] Minor refactor. --- lib/vero/senders/sidekiq.rb | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/vero/senders/sidekiq.rb b/lib/vero/senders/sidekiq.rb index 919e4af..df9831a 100644 --- a/lib/vero/senders/sidekiq.rb +++ b/lib/vero/senders/sidekiq.rb @@ -6,18 +6,32 @@ class SidekiqWorker include ::Sidekiq::Worker def perform(api_class, domain, options) - api_class.constantize.new(domain, options).perform - Vero::App.log(self, "method: #{api_class}, options: #{options.to_json}, response: sidekiq job queued") + send_to_vero(api_class, domain, options) + end + + protected + + def send_to_vero(api_class, domain, options) + api_klass(api_class).new(domain, options).perform + Vero::App.log(self, "method: #{api_class}, options: #{options.to_json}, response: sidekiq job performed") + end + + def api_klass(api_class) + api_class.constantize end end module Senders class Sidekiq def call(api_class, domain, options) - response = ::Vero::SidekiqWorker.perform_async(api_class.to_s, domain, options) + response = sender_class.perform_async(api_class.to_s, domain, options) Vero::App.log(self, "method: #{api_class.name}, options: #{options.to_json}, response: sidekiq job queued") response end + + def sender_class + ::Vero::SidekiqWorker + end end end -end \ No newline at end of file +end From 737fa2958ec23a18bec3f40bf62d1e138ab1872a Mon Sep 17 00:00:00 2001 From: James Lamont Date: Mon, 2 Nov 2015 09:45:48 +1100 Subject: [PATCH 2/4] Removed Rails-specific code. --- lib/vero.rb | 1 + lib/vero/api/base_api.rb | 5 +---- lib/vero/sender.rb | 4 +--- lib/vero/senders/base.rb | 7 ++----- lib/vero/senders/delayed_job.rb | 6 ++---- lib/vero/senders/resque.rb | 13 +++++-------- lib/vero/senders/sidekiq.rb | 7 +++---- lib/vero/senders/thread.rb | 5 ++--- spec/spec_helper.rb | 1 - 9 files changed, 17 insertions(+), 32 deletions(-) diff --git a/lib/vero.rb b/lib/vero.rb index aa7f4ed..d04054d 100644 --- a/lib/vero.rb +++ b/lib/vero.rb @@ -1,3 +1,4 @@ +require 'json' require 'rest-client' require 'vero/utility/ext' diff --git a/lib/vero/api/base_api.rb b/lib/vero/api/base_api.rb index 1604b5b..bb8816c 100644 --- a/lib/vero/api/base_api.rb +++ b/lib/vero/api/base_api.rb @@ -1,6 +1,3 @@ -require 'json' -require 'rest-client' - module Vero module Api module Workers @@ -65,4 +62,4 @@ def options_with_symbolized_keys(val) end end end -end \ No newline at end of file +end diff --git a/lib/vero/sender.rb b/lib/vero/sender.rb index 7daebd0..82a48fc 100644 --- a/lib/vero/sender.rb +++ b/lib/vero/sender.rb @@ -1,5 +1,3 @@ -require 'json' - module Vero class SenderHash < ::Hash def [](key) @@ -39,7 +37,7 @@ def self.send(api_class, sender_strategy, domain, options) else self.senders[false] end - + (sender_class.new).call(api_class, domain, options) rescue => e options_s = JSON.dump(options) diff --git a/lib/vero/senders/base.rb b/lib/vero/senders/base.rb index 8ab731e..f998333 100644 --- a/lib/vero/senders/base.rb +++ b/lib/vero/senders/base.rb @@ -1,14 +1,11 @@ -require 'json' - module Vero module Senders class Base def call(api_class, domain, options) response = api_class.perform(domain, options) - options_s = JSON.dump(options) - Vero::App.log(self, "method: #{api_class.name}, options: #{options_s}, response: job performed") + Vero::App.log(self, "method: #{api_class.name}, options: #{JSON.dump(options)}, response: job performed") response end end end -end \ No newline at end of file +end diff --git a/lib/vero/senders/delayed_job.rb b/lib/vero/senders/delayed_job.rb index c75fe5c..0a06761 100644 --- a/lib/vero/senders/delayed_job.rb +++ b/lib/vero/senders/delayed_job.rb @@ -1,4 +1,3 @@ -require 'json' require 'delayed_job' module Vero @@ -6,8 +5,7 @@ module Senders class DelayedJob def call(api_class, domain, options) response = ::Delayed::Job.enqueue api_class.new(domain, options) - options_s = JSON.dump(options) - Vero::App.log(self, "method: #{api_class.name}, options: #{options_s}, response: delayed job queued") + Vero::App.log(self, "method: #{api_class.name}, options: #{JSON.dump(options)}, response: delayed job queued") response rescue => e if e.message == "Could not find table 'delayed_jobs'" @@ -18,4 +16,4 @@ def call(api_class, domain, options) end end end -end \ No newline at end of file +end diff --git a/lib/vero/senders/resque.rb b/lib/vero/senders/resque.rb index ead61f8..a0b4836 100644 --- a/lib/vero/senders/resque.rb +++ b/lib/vero/senders/resque.rb @@ -1,19 +1,16 @@ -require 'json' require 'resque' module Vero class ResqueWorker @queue = :vero - def self.perform(api_class_name, domain, options) - api_class = eval(api_class_name) + def self.perform(api_class, domain, options) + api_class = eval(api_class.to_s) new_options = {} - options.each do |k,v| - new_options[k.to_sym] = v - end + options.each { |k,v| new_options[k.to_sym] = v } api_class.new(domain, new_options).perform - Vero::App.log(self, "method: #{api_class.name}, options: #{options.to_json}, response: resque job queued") + Vero::App.log(self, "method: #{api_class.name}, options: #{JSON.dump(options)}, response: resque job queued") end end @@ -24,4 +21,4 @@ def call(api_class, domain, options) end end end -end \ No newline at end of file +end diff --git a/lib/vero/senders/sidekiq.rb b/lib/vero/senders/sidekiq.rb index df9831a..05d4819 100644 --- a/lib/vero/senders/sidekiq.rb +++ b/lib/vero/senders/sidekiq.rb @@ -1,4 +1,3 @@ -require 'json' require 'sidekiq' module Vero @@ -13,11 +12,11 @@ def perform(api_class, domain, options) def send_to_vero(api_class, domain, options) api_klass(api_class).new(domain, options).perform - Vero::App.log(self, "method: #{api_class}, options: #{options.to_json}, response: sidekiq job performed") + Vero::App.log(self, "method: #{api_class}, options: #{JSON.dump(options)}, response: sidekiq job performed") end def api_klass(api_class) - api_class.constantize + eval(api_class.to_s) end end @@ -25,7 +24,7 @@ module Senders class Sidekiq def call(api_class, domain, options) response = sender_class.perform_async(api_class.to_s, domain, options) - Vero::App.log(self, "method: #{api_class.name}, options: #{options.to_json}, response: sidekiq job queued") + Vero::App.log(self, "method: #{api_class.name}, options: #{JSON.dump(options)}, response: sidekiq job queued") response end diff --git a/lib/vero/senders/thread.rb b/lib/vero/senders/thread.rb index f7e0960..980d6de 100644 --- a/lib/vero/senders/thread.rb +++ b/lib/vero/senders/thread.rb @@ -1,4 +1,3 @@ -require 'json' require 'sucker_punch' module Vero @@ -11,9 +10,9 @@ def perform(api_class, domain, options) begin api_class.new(domain, new_options).perform - Vero::App.log(self, "method: #{api_class.name}, options: #{options.to_json}, response: job performed") + Vero::App.log(self, "method: #{api_class.name}, options: #{JSON.dump(options)}, response: job performed") rescue => e - Vero::App.log(self, "method: #{api_class.name}, options: #{options.to_json}, response: #{e.message}") + Vero::App.log(self, "method: #{api_class.name}, options: #{JSON.dump(options)}, response: #{e.message}") end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index db70a62..b6eb330 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,7 +1,6 @@ require 'rubygems' require 'bundler/setup' require 'vero' -require 'json' require 'sucker_punch/testing/inline' Dir[::File.expand_path('../support/**/*.rb', __FILE__)].each { |f| require f } From 4e6e3f699b0a39d9d76117df876d554908f878c0 Mon Sep 17 00:00:00 2001 From: James Lamont Date: Mon, 2 Nov 2015 10:21:00 +1100 Subject: [PATCH 3/4] Added ability to define the Sidekiq sender class. --- lib/vero/config.rb | 6 ++++-- lib/vero/senders/sidekiq.rb | 8 +++++++- spec/lib/senders/sidekiq_spec.rb | 30 ++++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/vero/config.rb b/lib/vero/config.rb index c21b426..660a790 100644 --- a/lib/vero/config.rb +++ b/lib/vero/config.rb @@ -3,10 +3,12 @@ module Vero class Config attr_writer :domain - attr_accessor :api_key, :secret, :development_mode, :async, :disabled, :logging + attr_accessor :api_key, :secret, :development_mode, :async, :disabled + attr_accessor :logging, :sender_class def self.available_attributes - [:api_key, :secret, :development_mode, :async, :disabled, :logging, :domain] + [:api_key, :secret, :development_mode, :async, :disabled, :logging, + :domain, :sender_class] end def initialize diff --git a/lib/vero/senders/sidekiq.rb b/lib/vero/senders/sidekiq.rb index 05d4819..74e9dc8 100644 --- a/lib/vero/senders/sidekiq.rb +++ b/lib/vero/senders/sidekiq.rb @@ -29,7 +29,13 @@ def call(api_class, domain, options) end def sender_class - ::Vero::SidekiqWorker + klass = Vero::App.default_context.config.sender_class + + if klass && klass.new.is_a?(::Sidekiq::Worker) + klass + else + Vero::SidekiqWorker + end end end end diff --git a/spec/lib/senders/sidekiq_spec.rb b/spec/lib/senders/sidekiq_spec.rb index 1f66f55..c98dcfd 100644 --- a/spec/lib/senders/sidekiq_spec.rb +++ b/spec/lib/senders/sidekiq_spec.rb @@ -1,10 +1,36 @@ require 'spec_helper' +class SomeOtherSidekiqWorker < Vero::SidekiqWorker +end + describe Vero::Senders::Sidekiq do subject { Vero::Senders::Sidekiq.new } describe :call do it "should perform_async a Vero::SidekiqWorker" do - Vero::SidekiqWorker.should_receive(:perform_async).with('Vero::Api::Workers::Events::TrackAPI', "abc", {:test => "abc"}).once + Vero::SidekiqWorker.should_receive(:perform_async) + .with('Vero::Api::Workers::Events::TrackAPI', "abc", {:test => "abc"}) + .once + + subject.call(Vero::Api::Workers::Events::TrackAPI, "abc", {:test => "abc"}) + end + + it "should default to Vero::SidekiqWorker when the sender_class is invalid" do + Vero::App.default_context.config.sender_class = String + + Vero::SidekiqWorker.should_receive(:perform_async) + .with('Vero::Api::Workers::Events::TrackAPI', "abc", {:test => "abc"}) + .once + + subject.call(Vero::Api::Workers::Events::TrackAPI, "abc", {:test => "abc"}) + end + + it "should allow you to define a different Sidekiq sender class" do + Vero::App.default_context.config.sender_class = SomeOtherSidekiqWorker + + SomeOtherSidekiqWorker.should_receive(:perform_async) + .with('Vero::Api::Workers::Events::TrackAPI', "abc", {:test => "abc"}) + .once + subject.call(Vero::Api::Workers::Events::TrackAPI, "abc", {:test => "abc"}) end end @@ -22,4 +48,4 @@ subject.perform('Vero::Api::Workers::Events::TrackAPI', "abc", {:test => "abc"}) end end -end \ No newline at end of file +end From f9417186ea90df8ec7e3cff4d7e363d3fc879f73 Mon Sep 17 00:00:00 2001 From: James Lamont Date: Mon, 2 Nov 2015 10:21:06 +1100 Subject: [PATCH 4/4] Added bye bug. --- spec/spec_helper.rb | 1 + vero.gemspec | 1 + 2 files changed, 2 insertions(+) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index b6eb330..881e897 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -2,6 +2,7 @@ require 'bundler/setup' require 'vero' require 'sucker_punch/testing/inline' +# require 'byebug' Dir[::File.expand_path('../support/**/*.rb', __FILE__)].each { |f| require f } diff --git a/vero.gemspec b/vero.gemspec index 2e57ae5..088faf3 100644 --- a/vero.gemspec +++ b/vero.gemspec @@ -13,6 +13,7 @@ Gem::Specification.new do |s| s.authors = ['James Lamont'] dependencies = [ + [:development, 'byebug'], [:development, 'rails', "~> 3.0"], [:development, 'rspec'], [:development, 'delayed_job', "~> 3.0.0"],