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/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/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 919e4af..74e9dc8 100644 --- a/lib/vero/senders/sidekiq.rb +++ b/lib/vero/senders/sidekiq.rb @@ -1,4 +1,3 @@ -require 'json' require 'sidekiq' module Vero @@ -6,18 +5,38 @@ 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: #{JSON.dump(options)}, response: sidekiq job performed") + end + + def api_klass(api_class) + eval(api_class.to_s) end end module Senders class Sidekiq def call(api_class, domain, options) - response = ::Vero::SidekiqWorker.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 = sender_class.perform_async(api_class.to_s, domain, options) + Vero::App.log(self, "method: #{api_class.name}, options: #{JSON.dump(options)}, response: sidekiq job queued") response end + + def sender_class + klass = Vero::App.default_context.config.sender_class + + if klass && klass.new.is_a?(::Sidekiq::Worker) + klass + else + Vero::SidekiqWorker + end + end end end -end \ No newline at end of file +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/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 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index db70a62..881e897 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,8 +1,8 @@ require 'rubygems' require 'bundler/setup' require 'vero' -require 'json' 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"],