msgpack_rails 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c6eaa9d8b98123a292747cbc66404b247220f28
4
- data.tar.gz: ec4579fd1e49c004dab3b5e58c3958b2cecbb5ae
3
+ metadata.gz: 9e573e9ead86a6c6edc4e4ef6dc435d021695165
4
+ data.tar.gz: b718ccf23b3a33571a7e7212d1bb7ee7e5a07342
5
5
  SHA512:
6
- metadata.gz: 83276939225377e02cb0d7d0829fcddadca35138c830f0f6c3244da214d550d3a20a210790110c062f54c8d1900fd91e8ce0064f0b55efde29bb18c83c4a3768
7
- data.tar.gz: 715965446491d1b3ec94b1ec4d7d96cb141b384d003a67dde4b1533b3a247fca07d6c50a9d1daff7c4f1ca27786f7d670abf81fa1ac814ce9d973aa25bd76635
6
+ metadata.gz: aac10592d912856d86ab31d9e7a9367054b27ff4533d0af16800e34eb747d76d21d7430bb03922850b8e302ddf519ba4d3b061210b6a691bd960092ed3598caf
7
+ data.tar.gz: 286ba642e3fbf050682e18fab75a416b1522b8bb90c2c02f47e095c47838f108c9a05f09b61b294e1c9212ebb9d69478f6018dbf85ec1dc7a66d506f29ecb0e4
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
- # MsgpackRails
1
+ # msgpack_rails
2
2
 
3
- TODO: Write a gem description
3
+ The Rails way to serialize/deserialize with [Message Pack](http://msgpack.org).
4
+ It implements an [ActiveSupport](http://rubygems.org/gems/activesupport) adapter and an [ActiveModel](http://rubygems.org/gems/activemodel) adapter for Message Pack.
4
5
 
5
6
  ## Installation
6
7
 
@@ -18,7 +19,48 @@ Or install it yourself as:
18
19
 
19
20
  ## Usage
20
21
 
21
- TODO: Write usage instructions here
22
+ `msgpack_rails` converts data type using `as_json` before feeding it into [msgpack](http://rubygems.org/gems/msgpack).
23
+ Here are a few examples:
24
+
25
+ $ ActiveSupport::MessagePack.encode(:a => :b)
26
+ => "\x81\xA1a\xA1b"
27
+
28
+ $ ActiveSupport::MessagePack.encode(Time.now)
29
+ => "\xB92013-09-11T10:40:39-07:00"
30
+
31
+ $ Time.now.as_msgpack
32
+ => "2013-09-11T10:48:13-07:00"
33
+
34
+ $ Time.now.to_msgpack
35
+ => "\xB92013-09-11T10:40:39-07:00"
36
+
37
+ $ ActiveSupport::MessagePack.decode Time.now.to_msgpack
38
+ => "2013-09-11T11:23:07-07:00"
39
+
40
+ # After setting ActiveSupport.parse_msgpack_times to true
41
+ $ ActiveSupport::MessagePack.decode Time.now.to_msgpack
42
+ => Wed, 11 Sep 2013 11:25:18 -0700
43
+
44
+ You can also use it as part of `ActiveModel`:
45
+
46
+ ```ruby
47
+ class Contact
48
+ include ActiveModel::Serializers::MessagePack
49
+
50
+ ...
51
+ end
52
+
53
+ @contact = Contact.new
54
+ @contact.name = 'Konata Izumi'
55
+ @contact.age = 16
56
+ @contact.created_at = Time.utc(2006, 8, 1)
57
+ @contact.awesome = true
58
+ @contact.preferences = { 'shows' => 'anime' }
59
+
60
+ @contact.to_msgpack # => msgpack output
61
+ @contact.to_msgpack(:root => true) # => include root in msgpack output
62
+ ```
63
+
22
64
 
23
65
  ## Contributing
24
66
 
@@ -0,0 +1,39 @@
1
+ require "msgpack_rails/activesupport/message_pack"
2
+
3
+ module ActiveModel
4
+ module Serializers
5
+ module MessagePack
6
+ extend ActiveSupport::Concern
7
+ include ActiveModel::Serialization
8
+
9
+ included do
10
+ extend ActiveModel::Naming
11
+
12
+ class_attribute :include_root_in_msgpack
13
+ self.include_root_in_msgpack = false
14
+ end
15
+
16
+ def as_msgpack(options = {})
17
+ root = if options && options.key?(:root)
18
+ options[:root]
19
+ else
20
+ include_root_in_msgpack
21
+ end
22
+
23
+ if root
24
+ root = self.class.model_name.element if root == true
25
+ { root => serializable_hash(options) }
26
+ else
27
+ serializable_hash(options)
28
+ end
29
+ end
30
+
31
+ def from_msgpack(msgpack, include_root=include_root_in_msgpack)
32
+ hash = ActiveSupport::MessagePack.decode(msgpack)
33
+ hash = hash.values.first if include_root
34
+ self.attributes = hash
35
+ self
36
+ end
37
+ end
38
+ end
39
+ end
@@ -10,8 +10,9 @@ end
10
10
  # otherwise they will always use to_msgpack gem implementation.
11
11
  [Object, NilClass, TrueClass, FalseClass, Fixnum, Bignum, Float, String, Array, Hash, Symbol].each do |klass|
12
12
  klass.class_eval do
13
- # Dumps object in msgpack. See http://msgpack.org for more info.
14
- def to_msgpack(options = {})
13
+ alias_method :msgpack_to_msgpack, :to_msgpack if respond_to?(:to_msgpack)
14
+ # Dumps object in msgpack. See http://msgpack.org for more infoa
15
+ def to_msgpack(options = nil)
15
16
  ActiveSupport::MessagePack.encode(self, options)
16
17
  end
17
18
  end
@@ -0,0 +1,14 @@
1
+ module ActiveSupport
2
+ mattr_accessor :parse_msgpack_times
3
+
4
+ module MessagePack
5
+ def self.decode(data)
6
+ data = ::MessagePack.unpack(data)
7
+ if ActiveSupport.parse_msgpack_times
8
+ ActiveSupport::JSON.send(:convert_dates_from, data)
9
+ else
10
+ data
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,15 +3,19 @@ require "msgpack_rails/activesupport/core_ext/object/to_msgpack"
3
3
 
4
4
  module ActiveSupport
5
5
  module MessagePack
6
- def self.encode(value, options = {})
7
- out = options.fetch(:out, nil)
8
- ::MessagePack.pack(value.as_msgpack(options), out)
6
+ def self.encode(value, options = nil)
7
+ as_msgpack_opts, out = if options.is_a?(Hash)
8
+ [options, nil]
9
+ else
10
+ [nil, options]
11
+ end
12
+ value.as_msgpack(as_msgpack_opts).msgpack_to_msgpack(out)
9
13
  end
10
14
  end
11
15
  end
12
16
 
13
17
  class Object
14
- def as_msgpack(options = {})
18
+ def as_msgpack(options = nil)
15
19
  as_json(options)
16
20
  end
17
21
  end
@@ -1 +1,2 @@
1
1
  require "msgpack_rails/activesupport/message_pack/encoding"
2
+ require "msgpack_rails/activesupport/message_pack/decoding"
@@ -1,3 +1,3 @@
1
1
  module MsgpackRails
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/msgpack_rails.rb CHANGED
@@ -1,9 +1,19 @@
1
1
  require "active_support"
2
+ require "active_model"
2
3
  require "msgpack_rails/version"
3
4
  require "msgpack_rails/activesupport/message_pack"
5
+ require "msgpack_rails/activemodel/serializers/message_pack"
4
6
 
5
7
  module ActiveSupport
6
8
  eager_autoload do
7
9
  autoload :MessagePack
8
10
  end
9
11
  end
12
+
13
+ module ActiveModel
14
+ module Serializers
15
+ eager_autoload do
16
+ autoload :MessagePack
17
+ end
18
+ end
19
+ end
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Jingwen Owen Ou"]
10
10
  spec.email = ["jingweno@gmail.com"]
11
11
  spec.description = %q{Message Pack for Rails.}
12
- spec.summary = %q{Run Message Pack with Rails.}
13
- spec.homepage = ""
12
+ spec.summary = %q{The Rails way to serialize/deserialize with Message Pack.}
13
+ spec.homepage = "https://github.com/jingweno/msgpack_rails"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -19,5 +19,6 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_runtime_dependency "activesupport", ">= 3.0"
22
+ spec.add_runtime_dependency "activemodel", ">= 3.0"
22
23
  spec.add_runtime_dependency "msgpack"
23
24
  end
File without changes
@@ -0,0 +1,22 @@
1
+ require_relative "../test_helper"
2
+
3
+ class TestMessagePackEncoding < Test::Unit::TestCase
4
+ def test_decoding
5
+ [Time.now, [Date.new], {:foo => DateTime.new}].each do |data|
6
+ assert_equal data.as_json, ActiveSupport::MessagePack.decode(ActiveSupport::MessagePack.encode(data))
7
+ end
8
+
9
+ ActiveSupport.parse_msgpack_times = true
10
+
11
+ date = DateTime.parse(DateTime.now.as_json)
12
+
13
+ test_data = date
14
+ assert_equal test_data, ActiveSupport::MessagePack.decode(ActiveSupport::MessagePack.encode(test_data))
15
+
16
+ test_data = [date]
17
+ assert_equal test_data, ActiveSupport::MessagePack.decode(ActiveSupport::MessagePack.encode(test_data))
18
+
19
+ test_data = { "foo" => date }
20
+ assert_equal test_data, ActiveSupport::MessagePack.decode(ActiveSupport::MessagePack.encode(test_data))
21
+ end
22
+ end
File without changes
@@ -0,0 +1,26 @@
1
+ class Contact
2
+ extend ActiveModel::Naming
3
+ include ActiveModel::Conversion
4
+
5
+ attr_accessor :id, :name, :age, :created_at, :awesome, :preferences
6
+
7
+ def social
8
+ %w(twitter github)
9
+ end
10
+
11
+ def network
12
+ { git: :github }
13
+ end
14
+
15
+ def initialize(options = {})
16
+ options.each { |name, value| send("#{name}=", value) }
17
+ end
18
+
19
+ def pseudonyms
20
+ nil
21
+ end
22
+
23
+ def persisted?
24
+ id
25
+ end
26
+ end
@@ -0,0 +1,70 @@
1
+ require_relative "../test_helper"
2
+ require_relative "models/contact"
3
+
4
+ class Contact
5
+ include ActiveModel::Serializers::MessagePack
6
+ include ActiveModel::Validations
7
+
8
+ def attributes=(hash)
9
+ hash.each do |k, v|
10
+ instance_variable_set("@#{k}", v)
11
+ end
12
+ end
13
+
14
+ remove_method :attributes if method_defined?(:attributes)
15
+
16
+ def attributes
17
+ instance_values
18
+ end
19
+ end
20
+
21
+ class TestMessagePackSerializer < Test::Unit::TestCase
22
+ def setup
23
+ ActiveSupport.parse_msgpack_times = true
24
+
25
+ @contact = Contact.new
26
+ @contact.name = 'Konata Izumi'
27
+ @contact.age = 16
28
+ @contact.created_at = Time.utc(2006, 8, 1)
29
+ @contact.awesome = true
30
+ @contact.preferences = { 'shows' => 'anime' }
31
+ end
32
+
33
+ def teardown
34
+ # set to the default value
35
+ ActiveSupport.parse_msgpack_times = false
36
+ Contact.include_root_in_msgpack = false
37
+ end
38
+
39
+ def test_not_include_root_in_msgpack
40
+ contact = ActiveSupport::MessagePack.decode(@contact.to_msgpack)
41
+ assert_equal @contact.attributes.size, contact.size
42
+
43
+ @contact.attributes.each do |k, v|
44
+ assert_equal v, contact[k]
45
+ end
46
+ end
47
+
48
+ def test_include_root_in_msgpack
49
+ result = ActiveSupport::MessagePack.decode(@contact.to_msgpack(:root => true))
50
+ assert_equal 1, result.size
51
+
52
+ contact = result["contact"]
53
+ @contact.attributes.each do |k, v|
54
+ assert_equal v, contact[k]
55
+ end
56
+ end
57
+
58
+ def test_from_msgpack
59
+ ActiveSupport.parse_msgpack_times = false
60
+
61
+ msgpack = @contact.to_msgpack(:root => true)
62
+ result = Contact.new.from_msgpack(msgpack, true)
63
+
64
+ assert_equal result.name, @contact.name
65
+ assert_equal result.age, @contact.age
66
+ assert_equal Time.parse(result.created_at), @contact.created_at
67
+ assert_equal result.awesome, @contact.awesome
68
+ assert_equal result.preferences, @contact.preferences
69
+ end
70
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msgpack_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jingwen Owen Ou
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activemodel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: msgpack
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -51,15 +65,20 @@ files:
51
65
  - README.md
52
66
  - Rakefile
53
67
  - lib/msgpack_rails.rb
68
+ - lib/msgpack_rails/activemodel/serializers/message_pack.rb
54
69
  - lib/msgpack_rails/activesupport/core_ext/object/to_msgpack.rb
55
70
  - lib/msgpack_rails/activesupport/message_pack.rb
71
+ - lib/msgpack_rails/activesupport/message_pack/decoding.rb
56
72
  - lib/msgpack_rails/activesupport/message_pack/encoding.rb
57
73
  - lib/msgpack_rails/version.rb
58
74
  - msgpack_rails.gemspec
59
- - test/msgpack/core_ext_test.rb
60
- - test/msgpack/encoding_test.rb
75
+ - test/msgpack_rails/core_ext_test.rb
76
+ - test/msgpack_rails/decoding_test.rb
77
+ - test/msgpack_rails/encoding_test.rb
78
+ - test/msgpack_rails/models/contact.rb
79
+ - test/msgpack_rails/serializer_test.rb
61
80
  - test/test_helper.rb
62
- homepage: ''
81
+ homepage: https://github.com/jingweno/msgpack_rails
63
82
  licenses:
64
83
  - MIT
65
84
  metadata: {}
@@ -82,8 +101,11 @@ rubyforge_project:
82
101
  rubygems_version: 2.0.3
83
102
  signing_key:
84
103
  specification_version: 4
85
- summary: Run Message Pack with Rails.
104
+ summary: The Rails way to serialize/deserialize with Message Pack.
86
105
  test_files:
87
- - test/msgpack/core_ext_test.rb
88
- - test/msgpack/encoding_test.rb
106
+ - test/msgpack_rails/core_ext_test.rb
107
+ - test/msgpack_rails/decoding_test.rb
108
+ - test/msgpack_rails/encoding_test.rb
109
+ - test/msgpack_rails/models/contact.rb
110
+ - test/msgpack_rails/serializer_test.rb
89
111
  - test/test_helper.rb