undo-serializer-active_model 0.1.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a295ea13f84f57828d1f8f160c46776e92cff623
4
- data.tar.gz: 65880e189d3907d9a4ff5ca31fe3f9fca9156619
3
+ metadata.gz: 8576d795a1e019748983cc40635c7f08f5eae3a4
4
+ data.tar.gz: 3b8e2c05b390f9b5369d401143c34b606580f96a
5
5
  SHA512:
6
- metadata.gz: d995320ec3063c1f92e11062ce5f75190f78ae98313ad6f8cb5eeef8a54ff7cc64621af57ec3048da98d4ad9353866503cacb024e047b53252a5124d335d26a2
7
- data.tar.gz: 6d197310535c87d08e0f27564ee6b2be3fc4854b0fd5e6c3289250edcb5566cdb71cf1e92b7d4a557ebbf8f894adbf124cb3a989cdd8c9379c08c678244b72ac
6
+ metadata.gz: 6c1a19f280729c09cc6e5cea07755ed7be7362e157927b5b9749ac0ba95dc8af90a00f67281a1215839d6a8741fc39c0200bbf6ab8796cd45788bb8c2c4a357d
7
+ data.tar.gz: 68fd5978c65bc28eefb1c1a33a0207873744ec5fa3b5c79ba219bba56f3ebce1d7d261eae5e92cffb62abfe834ce24cfb8a006b41211dab04df22f623a9fedc0
data/.travis.yml CHANGED
@@ -11,11 +11,12 @@ rvm:
11
11
  - jruby-head
12
12
 
13
13
  gemfile:
14
- - gemfiles/3.0.gemfile
15
- - gemfiles/3.1.gemfile
16
- - gemfiles/3.2.gemfile
17
- - gemfiles/4.0.gemfile
18
- - gemfiles/4.1.gemfile
14
+ - gemfiles/activerecord_3.1.gemfile
15
+ - gemfiles/activerecord_3.2.gemfile
16
+ - gemfiles/activerecord_4.0.gemfile
17
+ - gemfiles/activerecord_4.1.gemfile
18
+ - gemfiles/activerecord_head.gemfile
19
+ - gemfiles/undo_head.gemfile
19
20
 
20
21
  matrix:
21
22
  allow_failures:
data/Appraisals CHANGED
@@ -1,24 +1,36 @@
1
- appraise "3.0" do
2
- gem "activerecord", "~> 3.0.20"
3
- gem "undo-serializer-active_model", :path => "../"
4
- end
5
-
6
- appraise "3.1" do
1
+ appraise "activerecord-3.1" do
7
2
  gem "activerecord", "~> 3.1.12"
8
3
  gem "undo-serializer-active_model", :path => "../"
9
4
  end
10
5
 
11
- appraise "3.2" do
6
+ appraise "activerecord-3.2" do
12
7
  gem "activerecord", "~> 3.2.15"
13
8
  gem "undo-serializer-active_model", :path => "../"
14
9
  end
15
10
 
16
- appraise "4.0" do
11
+ appraise "activerecord-4.0" do
17
12
  gem "activerecord", "~> 4.0.0"
18
13
  gem "undo-serializer-active_model", :path => "../"
19
14
  end
20
15
 
21
- appraise "4.1" do
16
+ appraise "activerecord-4.1" do
22
17
  gem "activerecord", "~> 4.1.0.beta"
23
18
  gem "undo-serializer-active_model", :path => "../"
24
19
  end
20
+
21
+ appraise "activerecord-head" do
22
+ gem "activerecord"
23
+ gem "undo-serializer-active_model", :path => "../"
24
+ end
25
+
26
+ appraise "undo-1.0.0" do
27
+ gem "activerecord"
28
+ gem "undo", "~> 1.0.0"
29
+ gem "undo-serializer-active_model", :path => "../"
30
+ end
31
+
32
+ appraise "undo-head" do
33
+ gem "activerecord"
34
+ gem "undo"
35
+ gem "undo-serializer-active_model", :path => "../"
36
+ end
data/README.md CHANGED
@@ -6,7 +6,9 @@ Undo
6
6
  [![Gem Version](https://badge.fury.io/rb/undo-serializer-active_model.png)](http://badge.fury.io/rb/undo-serializer-active_model)
7
7
  [![Code Climate](https://codeclimate.com/github/AlexParamonov/undo-serializer-active_model.png)](https://codeclimate.com/github/AlexParamonov/undo-serializer-active_model)
8
8
 
9
- ActiveModel serializer for Undo gem. Does not require anything from Rails so is friendly to use with POROs.
9
+ ActiveModel serializer for [Undo gem](https://github.com/AlexParamonov/undo).
10
+
11
+ Does not require anything from Rails so is friendly to use with POROs.
10
12
 
11
13
  Contents
12
14
  ---------
@@ -39,6 +41,7 @@ Most likely you'll install undo gem as well:
39
41
  Requirements
40
42
  ------------
41
43
  1. Ruby >= 1.9
44
+ 1. Undo gem
42
45
 
43
46
  Usage
44
47
  ------------
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.2
File without changes
File without changes
File without changes
File without changes
@@ -3,7 +3,7 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "rake"
6
- gem "activerecord", "~> 3.0.20"
6
+ gem "activerecord"
7
7
  gem "undo-serializer-active_model", :path=>"../"
8
8
 
9
9
  group :development do
@@ -0,0 +1,32 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "activerecord"
7
+ gem "undo", "~> 1.0.0"
8
+ gem "undo-serializer-active_model", :path=>"../"
9
+
10
+ group :development do
11
+ gem "pry"
12
+ gem "appraisal", :github=>"thoughtbot/appraisal"
13
+
14
+ platforms :ruby_19, :ruby_20 do
15
+ gem "pry-plus"
16
+ end
17
+ end
18
+
19
+ group :test do
20
+ gem "coveralls", :require=>false
21
+ end
22
+
23
+ group :test, :development do
24
+ gem "rspec", ">= 3.0.0.beta1"
25
+ gem "activerecord", ">= 3.0.0"
26
+ gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby
27
+ gem "sqlite3", :platform=>[:ruby, :mswin, :mingw]
28
+ gem "factory_girl"
29
+ gem "faker"
30
+ end
31
+
32
+ gemspec :path=>".././"
@@ -0,0 +1,31 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "activerecord"
7
+ gem "undo"
8
+ gem "undo-serializer-active_model", :path=>"../"
9
+
10
+ group :development do
11
+ gem "pry"
12
+ gem "appraisal", :github=>"thoughtbot/appraisal"
13
+
14
+ platforms :ruby_19, :ruby_20 do
15
+ gem "pry-plus"
16
+ end
17
+ end
18
+
19
+ group :test do
20
+ gem "coveralls", :require=>false
21
+ end
22
+
23
+ group :test, :development do
24
+ gem "rspec", ">= 3.0.0.beta1"
25
+ gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby
26
+ gem "sqlite3", :platform=>[:ruby, :mswin, :mingw]
27
+ gem "factory_girl"
28
+ gem "faker"
29
+ end
30
+
31
+ gemspec :path=>".././"
@@ -1,8 +1,15 @@
1
+ require_relative "active_model/connector"
2
+ require "undo/serializer/primitive"
3
+
1
4
  module Undo
2
5
  module Serializer
3
6
  class ActiveModel
4
7
  def initialize(options = {})
5
- load_options options
8
+ @connector = self.class.connector.with options
9
+ end
10
+
11
+ def name
12
+ "active_model"
6
13
  end
7
14
 
8
15
  def serialize(object, options = {})
@@ -10,71 +17,76 @@ module Undo
10
17
  serialize record, options
11
18
  end if array? object
12
19
 
13
- load_options options
20
+ return primitive_serializer.serialize(object) if primitive_serializer.serialize? object
21
+ serialize_object(object, options)
22
+ end
23
+
24
+ def deserialize(input, options = {})
25
+ return input.map do |record|
26
+ deserialize record
27
+ end if array? input
28
+
29
+ return primitive_serializer.deserialize(input) if primitive_serializer.deserialize? input
30
+ deserialize_object(input)
31
+ end
32
+
33
+ private
34
+ attr_reader :connector
14
35
 
15
- attributes = serialize_attributes(object) || {}
36
+ def primitive_serializer
37
+ @primitive_serializer ||= Serializer::Primitive.new
38
+ end
39
+
40
+ def serialize_object(object, options)
41
+ attributes = connector.serialize_attributes object
42
+
43
+ association_names = Array(options[:include])
16
44
  associations = {}
17
- Array(options[:include]).map do |association|
45
+ association_names.map do |association|
18
46
  associations[association] = serialize(object.public_send association)
19
47
  end
20
- pk_attributes = symbolize_keys(attributes).select do |attribute|
21
- primary_key_fields.include? attribute
22
- end
48
+
49
+ pk_attributes = connector.primary_key_attributes object, attributes
50
+ is_persisted = object.respond_to?(:persisted?) && object.persisted?
23
51
 
24
52
  {
53
+ serializer: name,
25
54
  attributes: attributes,
26
55
  associations: associations,
27
56
  meta: {
28
57
  pk_attributes: pk_attributes,
29
58
  class_name: object.class.name,
59
+ persisted: is_persisted,
30
60
  }
31
61
  }
32
62
  end
33
63
 
34
- def deserialize(object, options = {})
35
- return object.map do |record|
36
- deserialize record
37
- end if array? object
38
-
39
- load_options options
40
-
41
- hash = symbolize_keys object
42
- object_meta = hash.fetch :meta
43
- associations = hash.fetch :associations
44
- attributes = hash.fetch :attributes
64
+ def deserialize_object(object_data)
65
+ object_meta = connector.get_option :meta, object_data
66
+ associations = connector.get_option :associations, object_data
67
+ attributes = connector.get_option :attributes, object_data
45
68
 
46
69
  with_transaction do
47
- initialize_object(object_meta).tap do |object|
70
+ connector.initialize_object(object_meta).tap do |object|
71
+ return if object.nil?
72
+
48
73
  attributes.each do |field, value|
49
74
  deserialize_field object, field, value
50
75
  end
51
76
 
52
- # QUESTION: Set associations? object.association_name = deserialize association ?
53
77
  associations.each do |(association_name, association)|
54
- deserialize association
78
+ connector.associate object, association_name, deserialize(association)
55
79
  end
56
80
 
57
- persist object
81
+ connector.persist object, object_meta
58
82
  end
59
83
  end
60
84
  end
61
85
 
62
- private
63
- attr_reader :serialize_attributes_source,
64
- :initialize_object_source,
65
- :persist_object_source
66
-
67
86
  def deserialize_field(object, field, value)
68
87
  object.send "#{field}=", value # not public_send!
69
88
  end
70
89
 
71
- def initialize_object(meta)
72
- object_class = constantize meta.fetch(:class_name)
73
- pk_attributes = meta.fetch :pk_attributes
74
-
75
- find_or_initialize object_class, pk_attributes
76
- end
77
-
78
90
  def with_transaction(&block)
79
91
  if defined? ActiveRecord
80
92
  ActiveRecord::Base.transaction(&block)
@@ -83,43 +95,10 @@ module Undo
83
95
  end
84
96
  end
85
97
 
86
- def load_options(options)
87
- @serialize_attributes_source = options.fetch :serialize_attributes, @serialize_attributes_source ||
88
- ->(object) { object.attributes }
89
-
90
- @initialize_object_source = options.fetch :find_or_initialize, @initialize_object_source ||
91
- ->(object_class, pk_query) { object_class.respond_to?(:where) && object_class.where(pk_query).first || object_class.new(pk_query) }
92
-
93
- @persist_object_source = options.fetch :persist, @persist_object_source ||
94
- ->(object) { object.respond_to?(:save!) && object.save! }
95
-
96
- @primary_key_fields = options.fetch :primary_key, @primary_key_fields || :id
97
- end
98
-
99
- def primary_key_fields
100
- Array(@primary_key_fields)
101
- end
102
-
103
- def serialize_attributes(*args); serialize_attributes_source.call(*args) end
104
- def find_or_initialize(*args); initialize_object_source.call(*args) end
105
- def persist(*args); persist_object_source.call(*args) end
106
-
107
98
  def array?(object)
108
99
  object.respond_to?(:map) && ! object.is_a?(Hash)
109
100
  end
110
- # ActiveSupport methods
111
- def symbolize_keys(hash)
112
- hash.each_with_object({}) do |(key, value), result|
113
- new_key = key.is_a?(String) ? key.to_sym : key
114
- new_value = value.is_a?(Hash) ? symbolize_keys(value) : value
115
101
 
116
- result[new_key] = new_value
117
- end
118
- end
119
-
120
- def constantize(class_name)
121
- class_name.split('::').inject(Kernel) { |object, name| object = object.const_get(name); object }
122
- end
123
102
  end
124
103
  end
125
104
  end
@@ -0,0 +1,61 @@
1
+ require "virtus"
2
+
3
+ module Undo
4
+ module Serializer
5
+ class ActiveModel
6
+ def self.connector
7
+ @config ||= Connector.new
8
+ end
9
+
10
+ private
11
+ class Connector
12
+ include Virtus.value_object
13
+ values do
14
+ attribute :attribute_serializer, Proc, default: proc { -> object { object.attributes } }
15
+ attribute :persister, Proc, default: proc { -> object { object.respond_to?(:save!) && object.save! } }
16
+ attribute :primary_key_fetcher, Proc, default: proc { -> object { object.respond_to?(:primary_key) && object.primary_key || :id }}
17
+ attribute :associator, Proc, default: proc { -> object, association_name, value { setter = "#{association_name}="; object.respond_to?(setter) && object.send(setter, value) }}
18
+ attribute :object_initializer, Proc, default: proc { -> object_class, attributes { object_class.respond_to?(:where) && object_class.where(attributes).first || object_class.new(attributes) }}
19
+ end
20
+
21
+ def primary_key_attributes(object, attributes)
22
+ fields = Array(primary_key_fetcher.call(object)).map(&:to_sym)
23
+
24
+ fields.each_with_object({}) do |field, pk_attributes|
25
+ pk_attributes[field] = attributes[field] || attributes[field.to_s]
26
+ end
27
+ end
28
+
29
+ def initialize_object(meta)
30
+ object_class = constantize get_option :class_name, meta
31
+ pk_attributes = get_option :pk_attributes, meta
32
+
33
+ object_initializer.call object_class, pk_attributes
34
+ end
35
+
36
+ def persist(object, object_meta)
37
+ persister.call object unless [false, nil, 0, "false"].include? get_option :persisted, object_meta
38
+ end
39
+
40
+ def associate(object, association, associations)
41
+ associator.call object, association, associations
42
+ end
43
+
44
+ def serialize_attributes(object)
45
+ attribute_serializer.call(object) || {}
46
+ end
47
+
48
+ def constantize(class_name)
49
+ class_name.split('::').inject(Kernel) { |object, name| object = object.const_get(name); object }
50
+ end
51
+
52
+ def get_option(name, options)
53
+ options.fetch name.to_sym do
54
+ options.fetch name.to_s
55
+ end
56
+ end
57
+
58
+ end
59
+ end
60
+ end
61
+ end
@@ -18,16 +18,37 @@ describe Undo::Serializer::ActiveModel do
18
18
  expect(restored_user).to be_persisted
19
19
  end
20
20
 
21
+ describe "not persisted object" do
22
+ let(:user) { build :user }
23
+
24
+ it "restores object" do
25
+ hash = serializer.serialize user
26
+ restored_user = serializer.deserialize hash
27
+
28
+ expect(restored_user.attributes).to eq user.attributes
29
+ expect(restored_user).not_to be_persisted
30
+ end
31
+
32
+ it "restores provided associations" do
33
+ roles = build_list :role, 3
34
+ user.roles = roles
35
+ hash = serializer.serialize user, include: :roles
36
+
37
+ restored_user = serializer.deserialize hash
38
+
39
+ expect(restored_user).not_to be_persisted
40
+ expect(restored_user.roles.map(&:attributes)).to match roles.map(&:attributes)
41
+ end
42
+ end
43
+
21
44
  describe "associations" do
22
45
  it "restores provided associations" do
23
46
  roles = create_list :role, 3, user: user
24
47
  hash = serializer.serialize user, include: :roles
25
48
  user.delete
26
- Role.delete_all # HACK for ActiveRecord 3.0
27
49
 
28
50
  restored_user = serializer.deserialize hash
29
51
 
30
- restored_user.reload # HACK for ActiveRecord 3.0
31
52
  expect(restored_user).to eq user
32
53
  expect(restored_user.roles).to eq roles
33
54
  end
@@ -54,4 +75,17 @@ describe Undo::Serializer::ActiveModel do
54
75
  expect(restored_users).to eq users
55
76
  end
56
77
  end
78
+
79
+ describe "json store" do
80
+ it "restores object" do
81
+ hash = serializer.serialize user
82
+ hash = hash.to_json
83
+ user.delete
84
+ restored_user = serializer.deserialize JSON.load(hash)
85
+
86
+ expect(restored_user).to eq user
87
+ expect(user).not_to be_persisted
88
+ expect(restored_user).to be_persisted
89
+ end
90
+ end
57
91
  end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "undo"
3
+ require "support/active_record"
4
+ require "user"
5
+ require 'undo/integration/shared_undo_integration_examples.rb'
6
+
7
+ Undo.configure do |config|
8
+ config.serializer = Undo::Serializer::ActiveModel.new
9
+ end
10
+
11
+ describe Undo do
12
+ let(:object) { create :user }
13
+
14
+ include_examples "undo integration"
15
+
16
+ it "stores and restores symbols" do
17
+ uuid = subject.store :foo
18
+ expect(subject.restore uuid).to eq :foo
19
+ end
20
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,4 @@
1
1
  require_relative "support/ci_helper"
2
2
  require "undo/serializer/active_model"
3
3
 
4
- RSpec.configure do |config|
5
- config.expect_with :rspec do |c|
6
- c.syntax = :expect
7
- end
8
- end
9
-
10
4
  $: << File.expand_path('../lib', File.dirname(__FILE__))
@@ -0,0 +1,38 @@
1
+ require "spec_helper"
2
+
3
+ describe Undo::Serializer::ActiveModel::Connector do
4
+ let(:object) { double :object }
5
+ let(:serializer) { subject }
6
+
7
+ describe "#primary_key_attributes" do
8
+ let(:attributes) { { uuid: "identifier", foo: :bar, "hello" => "world" } }
9
+
10
+ it "extracts object primary key attributes" do
11
+ expect(object).to receive(:primary_key) { "uuid" }
12
+
13
+ expect(serializer.primary_key_attributes object, attributes).to eq uuid: "identifier"
14
+ end
15
+
16
+ it "redefines primary key attribute names by primary_key_fetcher" do
17
+ serializer = described_class.new primary_key_fetcher: -> object { %w[hello uuid] }
18
+
19
+ expect(serializer.primary_key_attributes object, attributes).to eq ({
20
+ hello: "world",
21
+ uuid: "identifier"
22
+ })
23
+ end
24
+
25
+ it "use nil value when no primary_key attributes available" do
26
+ allow(object).to receive(:primary_key) { "unknown" }
27
+
28
+ expect(serializer.primary_key_attributes object, attributes).to eq unknown: nil
29
+ end
30
+
31
+ it "accepts string and symbol as uuid key" do
32
+ allow(object).to receive(:primary_key) { "uuid" }
33
+ expect(serializer.primary_key_attributes object, attributes).to eq uuid: "identifier"
34
+ allow(object).to receive(:primary_key) { :uuid }
35
+ expect(serializer.primary_key_attributes object, attributes).to eq uuid: "identifier"
36
+ end
37
+ end
38
+ end
@@ -1,73 +1,103 @@
1
1
  require "spec_helper"
2
2
 
3
+ class FooBarTestObject < OpenStruct
4
+ def attributes; marshal_dump end
5
+ end
6
+
3
7
  describe Undo::Serializer::ActiveModel do
4
8
  subject { described_class }
5
9
  let(:serializer) { subject.new }
6
- let(:object) { double :object, attributes: { id: 1, foo: "bar", bar: "baz", hello: "world" } }
7
-
8
- describe "custom finder fields" do
9
- it "uses finder fields to find the object" do
10
- FooBarTestObject = Class.new
11
- serializer = subject.new primary_key: [:foo, :bar]
12
- allow(object).to receive(:class) { FooBarTestObject }
13
-
14
- expect(FooBarTestObject).to receive(:new).with(foo: "bar", bar: "baz") { object.as_null_object }
15
-
16
- hash = serializer.serialize object
17
- serializer.deserialize hash
18
- end
19
- end
20
-
21
- describe "custom serializer" do
22
- it "uses provided attribute serialization" do
23
- attribute_serializer = double :attribute_serializer
24
- serializer = subject.new serialize_attributes: attribute_serializer
25
-
26
- expect(attribute_serializer).to receive(:call).with(object)
27
- serializer.serialize object
10
+ let(:object_class) { FooBarTestObject }
11
+ let(:object) { FooBarTestObject.new }
12
+
13
+ describe "options" do
14
+ describe "attribute_serializer" do
15
+ let(:attribute_serializer) { double :attribute_serializer }
16
+ let(:serializer) { subject.new attribute_serializer: attribute_serializer }
17
+
18
+ it "uses provided attribute serialization" do
19
+ expect(attribute_serializer).to receive(:call).with(object) { {} }
20
+ serializer.serialize object
21
+ end
22
+
23
+ context "when nil" do
24
+ let(:attribute_serializer) { proc { nil } }
25
+
26
+ it "does not raise" do
27
+ expect { serializer.serialize object }.not_to raise_error
28
+ end
29
+ end
28
30
  end
29
31
 
30
- it "uses provided find_or_initialize deserialization" do
31
- deserializer = double :find_or_initialize_deserializer
32
- serializer = subject.new find_or_initialize: deserializer
33
-
34
- hash = serializer.serialize object
35
- expect(deserializer).to receive(:call).with(object.class, id: 1) { object.as_null_object }
36
- serializer.deserialize hash
32
+ describe "object_initializer" do
33
+ let(:initializer) { double :initializer }
34
+ let(:serializer) { subject.new object_initializer: initializer }
35
+ before do
36
+ object.id = 1
37
+ object.foo = :bar
38
+ end
39
+
40
+ it "uses provided initializer" do
41
+ hash = serializer.serialize object
42
+ expect(initializer).to receive(:call).with(object.class, id: 1) { double.as_null_object }
43
+ serializer.deserialize hash
44
+ end
45
+
46
+ context "when nil" do
47
+ let(:initializer) { proc { nil } }
48
+
49
+ it "returns nil" do
50
+ hash = serializer.serialize object
51
+ expect(serializer.deserialize hash).to eq nil
52
+ end
53
+
54
+ it "does not assigns attributes" do
55
+ hash = serializer.serialize object
56
+ expect{ serializer.deserialize hash }.not_to raise_error
57
+ expect(serializer.deserialize hash).to eq nil
58
+ end
59
+ end
37
60
  end
38
61
 
39
- it "uses provided way of persisting object" do
40
- persister = double :persister
41
-
42
- deserializer = double :find_or_initialize_deserializer
43
- allow(deserializer).to receive(:call) { object.as_null_object }
44
- serializer = subject.new persist: persister, find_or_initialize: deserializer
45
-
46
- hash = serializer.serialize object
47
- expect(persister).to receive(:call).with(object)
48
- serializer.deserialize hash
49
- end
50
- end
62
+ describe "assign associations" do
63
+ it "uses provided way of assigning associations" do
64
+ associated_object = object_class.new name: "association"
65
+ object.association_name = [associated_object]
51
66
 
52
- describe "in place serializer options" do
53
- specify "#serialize" do
54
- attribute_serializer = double :attribute_serializer
55
- serializer = subject.new
67
+ associator = double :associator
68
+ serializer = subject.new associator: associator
56
69
 
57
- expect(attribute_serializer).to receive(:call).with(object)
58
- serializer.serialize object,
59
- serialize_attributes: attribute_serializer
70
+ hash = serializer.serialize object, include: :association_name
71
+ expect(associator).to receive(:call) do |object, name, associations|
72
+ expect(associations.map(&:name)).to eq [associated_object.name]
73
+ end
74
+ serializer.deserialize hash
75
+ end
60
76
  end
61
77
 
62
- specify "#deserialize" do
63
- deserializer = double :find_or_initialize_deserializer
64
- serializer = subject.new
65
-
66
- hash = serializer.serialize object
67
- expect(deserializer).to receive(:call).with(object.class, id: 1) { object.as_null_object }
68
- serializer.deserialize hash,
69
- find_or_initialize: deserializer
78
+ describe "persist object" do
79
+ it "uses provided way of persisting object" do
80
+ allow(object).to receive(:persisted?) { true }
81
+ persister = double :persister
82
+ serializer = subject.new persister: persister,
83
+ object_initializer: proc { object }
84
+
85
+ hash = serializer.serialize object
86
+ expect(persister).to receive(:call).with(object)
87
+ serializer.deserialize hash
88
+ end
89
+
90
+ it "does not persist new record objects" do
91
+ persister = double :persister
92
+ serializer = subject.new persister: persister,
93
+ object_initializer: proc { object }
94
+
95
+ allow(object).to receive(:persisted?) { false }
96
+
97
+ hash = serializer.serialize object
98
+ expect(persister).not_to receive(:call)
99
+ serializer.deserialize hash
100
+ end
70
101
  end
71
102
  end
72
-
73
103
  end
@@ -17,5 +17,9 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.add_dependency 'undo', '~> 1.0'
21
+ spec.add_dependency 'undo-serializer-primitive', '~> 0.1'
22
+ spec.add_dependency 'virtus', '~> 1.0'
20
23
  spec.add_development_dependency 'bundler', '~> 1.0'
24
+ spec.add_development_dependency "rspec", ">= 3.0.0.beta1"
21
25
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: undo-serializer-active_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Paramonov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-16 00:00:00.000000000 Z
11
+ date: 2014-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: undo
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: undo-serializer-primitive
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: virtus
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: bundler
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +66,20 @@ dependencies:
24
66
  - - "~>"
25
67
  - !ruby/object:Gem::Version
26
68
  version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0.beta1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0.beta1
27
83
  description: ActiveModel serializer for Undo gem. Does not require anything from Rails
28
84
  so is friendly to use with POROs.
29
85
  email:
@@ -44,12 +100,17 @@ files:
44
100
  - README.md
45
101
  - Rakefile
46
102
  - VERSION
47
- - gemfiles/3.0.gemfile
48
- - gemfiles/3.1.gemfile
49
- - gemfiles/3.2.gemfile
50
- - gemfiles/4.0.gemfile
51
- - gemfiles/4.1.gemfile
103
+ - gemfiles/activerecord_3.1.gemfile
104
+ - gemfiles/activerecord_3.2.gemfile
105
+ - gemfiles/activerecord_4.0.gemfile
106
+ - gemfiles/activerecord_4.1.gemfile
107
+ - gemfiles/activerecord_head.gemfile
108
+ - gemfiles/undo_1.0.0.gemfile
109
+ - gemfiles/undo_head.gemfile
52
110
  - lib/undo/serializer/active_model.rb
111
+ - lib/undo/serializer/active_model/connector.rb
112
+ - spec/integration/active_record_spec.rb
113
+ - spec/integration/undo_spec.rb
53
114
  - spec/spec_helper.rb
54
115
  - spec/support/active_record.rb
55
116
  - spec/support/active_record/role.rb
@@ -57,7 +118,7 @@ files:
57
118
  - spec/support/active_record/user.rb
58
119
  - spec/support/ci_helper.rb
59
120
  - spec/support/factories.rb
60
- - spec/undo/serializer/active_model_integration_spec.rb
121
+ - spec/undo/serializer/active_model/connector_spec.rb
61
122
  - spec/undo/serializer/active_model_spec.rb
62
123
  - undo-serializer-active_model.gemspec
63
124
  homepage: http://github.com/AlexParamonov/undo-serializer-active_model
@@ -86,6 +147,8 @@ specification_version: 4
86
147
  summary: ActiveModel serializer for Undo gem. Does not require anything from Rails
87
148
  so is friendly to use with POROs.
88
149
  test_files:
150
+ - spec/integration/active_record_spec.rb
151
+ - spec/integration/undo_spec.rb
89
152
  - spec/spec_helper.rb
90
153
  - spec/support/active_record.rb
91
154
  - spec/support/active_record/role.rb
@@ -93,5 +156,5 @@ test_files:
93
156
  - spec/support/active_record/user.rb
94
157
  - spec/support/ci_helper.rb
95
158
  - spec/support/factories.rb
96
- - spec/undo/serializer/active_model_integration_spec.rb
159
+ - spec/undo/serializer/active_model/connector_spec.rb
97
160
  - spec/undo/serializer/active_model_spec.rb