File tree Expand file tree Collapse file tree 5 files changed +67
-26
lines changed
Expand file tree Collapse file tree 5 files changed +67
-26
lines changed Original file line number Diff line number Diff line change 1313require 'resque/worker'
1414require 'resque/plugin'
1515require 'resque/queue'
16+ require 'resque/coder'
17+ require 'resque/multi_json_coder'
1618
1719module Resque
1820 include Helpers
@@ -45,10 +47,17 @@ def redis=(server)
4547 @redis = Redis ::Namespace . new ( :resque , :redis => server )
4648 end
4749 @queues = Hash . new { |h , name |
48- h [ name ] = Resque ::Queue . new ( name , @redis , self )
50+ h [ name ] = Resque ::Queue . new ( name , @redis , coder )
4951 }
5052 end
5153
54+ # Encapsulation of encode/decode. Overwrite this to use it across Resque.
55+ # This defaults to MultiJson for backwards compatibilty.
56+ def coder
57+ @coder ||= MultiJsonCoder . new
58+ end
59+ attr_writer :coder
60+
5261 # Returns the current Redis connection. If none has been created, will
5362 # create a new one.
5463 def redis
Original file line number Diff line number Diff line change 1+ module Resque
2+ class EncodeException < StandardError ; end
3+ class DecodeException < StandardError ; end
4+
5+ class Coder
6+ # Given a Ruby object, returns a string suitable for storage in a
7+ # queue.
8+ def encode ( object )
9+ raise EncodeException
10+ end
11+
12+ # alias for encode
13+ def dump ( object )
14+ encode ( object )
15+ end
16+
17+ # Given a string, returns a Ruby object.
18+ def decode ( object )
19+ raise DecodeException
20+ end
21+
22+ # alias for decode
23+ def load ( object )
24+ decode ( object )
25+ end
26+ end
27+ end
Original file line number Diff line number Diff line change 1- require 'multi_json'
2-
3- # OkJson won't work because it doesn't serialize symbols
4- # in the same way yajl and json do.
5- if MultiJson . engine . to_s == 'MultiJson::Engines::OkJson'
6- raise "Please install the yajl-ruby or json gem"
7- end
8-
91module Resque
102 # Methods used by various classes in Resque.
113 module Helpers
12- class DecodeException < StandardError ; end
13-
144 # Direct access to the Redis instance.
155 def redis
166 Resque . redis
177 end
188
19- # Given a Ruby object, returns a string suitable for storage in a
20- # queue.
219 def encode ( object )
22- :: MultiJson . encode ( object )
10+ Resque . coder . encode ( object )
2311 end
24- alias :dump :encode
2512
26- # Given a string, returns a Ruby object.
2713 def decode ( object )
28- return unless object
29-
30- begin
31- ::MultiJson . decode ( object )
32- rescue ::MultiJson ::DecodeError => e
33- raise DecodeException , e . message , e . backtrace
34- end
14+ Resque . coder . decode ( object )
3515 end
36- alias :load :decode
3716
3817 # Given a word with dashes, returns a camel cased version of it.
3918 #
Original file line number Diff line number Diff line change 1+ require 'multi_json'
2+ require 'resque/coder'
3+
4+ # OkJson won't work because it doesn't serialize symbols
5+ # in the same way yajl and json do.
6+ if MultiJson . engine . to_s == 'MultiJson::Engines::OkJson'
7+ raise "Please install the yajl-ruby or json gem"
8+ end
9+
10+ module Resque
11+ class MultiJsonCoder < Coder
12+ def encode ( object )
13+ ::MultiJson . encode ( object )
14+ end
15+
16+ def decode ( object )
17+ return unless object
18+
19+ begin
20+ ::MultiJson . decode ( object )
21+ rescue ::MultiJson ::DecodeError => e
22+ raise DecodeException , e . message , e . backtrace
23+ end
24+ end
25+ end
26+ end
Original file line number Diff line number Diff line change 263263 end
264264
265265 it "decode bad json" do
266- assert_raises Resque ::Helpers :: DecodeException do
267- Resque . decode ( "{\" error\" :\" Module not found \\ u002\" }" )
266+ assert_raises Resque ::DecodeException do
267+ Resque . coder . decode ( "{\" error\" :\" Module not found \\ u002\" }" )
268268 end
269269 end
270270
You can’t perform that action at this time.
0 commit comments