Skip to content

Commit 1704ef4

Browse files
committed
refactor the encode/decode into it's own class
1 parent c7b5b0e commit 1704ef4

File tree

5 files changed

+67
-26
lines changed

5 files changed

+67
-26
lines changed

lib/resque.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
require 'resque/worker'
1414
require 'resque/plugin'
1515
require 'resque/queue'
16+
require 'resque/coder'
17+
require 'resque/multi_json_coder'
1618

1719
module 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

lib/resque/coder.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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

lib/resque/helpers.rb

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,18 @@
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-
91
module 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
#

lib/resque/multi_json_coder.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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

test/resque_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,8 @@
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

0 commit comments

Comments
 (0)