forked from sidekiq/sidekiq
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ActiveRecord, classes, modules and other parameters are serialized to strings such as "AR:User:2" and "CLASS:SomeClass" in order to have minimum concern about deserialization on the worker methods (used w/ #delay) and classes.
- Loading branch information
Showing
14 changed files
with
177 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
require 'sidekiq/middleware/chain' | ||
require 'active_support' | ||
|
||
module Sidekiq | ||
class Client | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
module Sidekiq | ||
module Extensions | ||
class ArgsSerializer | ||
# inspired by DelayedJob | ||
CLASS_STRING_FORMAT = /^CLASS\:([A-Z][\w\:]+)$/ | ||
AR_STRING_FORMAT = /^AR\:([A-Z][\w\:]+)\:(\d+)$/ | ||
YAML_STRING_FORMAT = /\A---/ | ||
|
||
def self.serialize(obj) | ||
case obj | ||
when Array then obj.map { |o| serialize(o) } | ||
when Hash then obj.inject({}) { |memo, (k, v)| memo[k] = serialize(v); memo } | ||
when ::ActiveRecord::Base then "AR:#{obj.class.name}:#{obj.id}" | ||
when Class, Module then "CLASS:#{obj.name}" | ||
else obj.to_yaml | ||
end | ||
end | ||
|
||
def self.deserialize(obj) | ||
case obj | ||
when CLASS_STRING_FORMAT then $1.constantize | ||
when AR_STRING_FORMAT then $1.constantize.where(id: $2).first | ||
when Array then obj.map { |item| deserialize(item) } | ||
when Hash then obj.inject({}) { |memo, (k, v)| memo[k] = deserialize(v); memo } | ||
else YAML.load(obj) | ||
end | ||
end | ||
|
||
|
||
def self.serialize_message(target, method_name, *args) | ||
[ serialize(target), method_name, serialize(args) ] | ||
end | ||
|
||
def self.deserialize_message(*msg) | ||
[ deserialize(msg[0]), msg[1], deserialize(msg[2]) ] | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
require 'helper' | ||
require 'sidekiq' | ||
require 'active_record' | ||
require 'action_mailer' | ||
|
||
class TestArgsSerializer < MiniTest::Unit::TestCase | ||
describe 'args parser' do | ||
before do | ||
ActiveRecord::Base.establish_connection adapter: "sqlite3", database: File.join(File.dirname(__FILE__), "db/test.sqlite3") | ||
end | ||
|
||
def ser(o) | ||
Sidekiq::Extensions::ArgsSerializer.serialize(o) | ||
end | ||
|
||
def deser(s) | ||
Sidekiq::Extensions::ArgsSerializer.deserialize(s) | ||
end | ||
|
||
class User < ActiveRecord::Base | ||
end | ||
|
||
it 'serializes active record class' do | ||
assert_equal "CLASS:TestArgsSerializer::User", ser(User) | ||
assert_equal TestArgsSerializer::User, deser(ser(User)) | ||
end | ||
|
||
it 'serializes active record instance' do | ||
user = User.create! | ||
assert_equal "AR:TestArgsSerializer::User:#{user.id}", ser(user) | ||
assert_equal user, deser(ser(user)) | ||
end | ||
|
||
class SomeClass | ||
end | ||
|
||
module SomeModule | ||
end | ||
|
||
it 'serializes class' do | ||
assert_equal "CLASS:TestArgsSerializer::SomeClass", ser(SomeClass) | ||
assert_equal SomeClass, deser(ser(SomeClass)) | ||
end | ||
|
||
it 'serializes module' do | ||
assert_equal "CLASS:TestArgsSerializer::SomeModule", ser(SomeModule) | ||
assert_equal SomeModule, deser(ser(SomeModule)) | ||
end | ||
|
||
it 'serializes array' do | ||
assert_equal [1, 2, 3], deser(ser([1, 2, 3])) | ||
end | ||
|
||
it 'serializes complex object' do | ||
user = User.create! | ||
user_2 = User.create! | ||
user_3 = User.create! | ||
obj = [user, [user_2], { user_3: user_3, number: 1, string: "s" }] | ||
assert_equal obj, deser(ser(obj)) | ||
end | ||
|
||
it 'serializes date' do | ||
today = Date.today | ||
assert_equal today, deser(ser(today)) | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters