protobuf-activerecord 3.4.3 → 3.4.4.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +2 -2
- data/lib/protobuf/active_record/nested_attributes.rb +25 -2
- data/lib/protobuf/active_record/transformation.rb +14 -4
- data/lib/protobuf/active_record/version.rb +1 -1
- data/spec/protobuf/active_record/nested_attributes_spec.rb +29 -0
- data/spec/protobuf/active_record/serialization_spec.rb +9 -25
- data/spec/protobuf/active_record/transformation_spec.rb +4 -7
- data/spec/spec_helper.rb +9 -9
- data/spec/support/db/setup.rb +8 -1
- data/spec/support/definitions/{user.proto → messages.proto} +6 -0
- data/spec/support/models.rb +2 -1
- data/spec/support/models/photo.rb +3 -0
- data/spec/support/models/user.rb +6 -0
- data/spec/support/protobuf/{user.pb.rb → messages.pb.rb} +10 -1
- metadata +13 -11
- data/spec/support/protobuf.rb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da307ffdb292153c946b5e4d6fb51c601d19f887
|
4
|
+
data.tar.gz: '0548445446f601abd66b34b34cab4bbe8f4237b3'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7779dd21a08bde0e8dc52ee6cc84170811dc59ad13dbc4ee43a46c04ffc41912620c2599964ecc20452432f6159c2367eac0203a7c41bc6fe958dae65da278d1
|
7
|
+
data.tar.gz: 972422ff88ff326053604bf64b15cd0c63360146960ea815c81beb7684dbf535282aa27b8e4b640deec9890d6bb7d27cf6846005b4ac1aabe282d89c5cc5e33c
|
data/Rakefile
CHANGED
@@ -16,16 +16,39 @@ module Protobuf
|
|
16
16
|
end
|
17
17
|
|
18
18
|
module ClassMethods
|
19
|
-
# :nodoc
|
19
|
+
# :nodoc:
|
20
20
|
def accepts_nested_attributes_for(*attr_names)
|
21
21
|
attribute_names = attr_names.dup
|
22
22
|
attribute_names.extract_options!
|
23
|
+
attribute_names.map!(&:to_s)
|
23
24
|
|
24
25
|
super
|
25
26
|
|
26
|
-
self._protobuf_nested_attributes += attribute_names
|
27
|
+
self._protobuf_nested_attributes += attribute_names
|
27
28
|
end
|
28
29
|
end
|
30
|
+
|
31
|
+
# :nodoc:
|
32
|
+
def assign_nested_attributes_for_collection_association(association_name, attributes_collection)
|
33
|
+
if attributes_collection.first.is_a?(::Protobuf::Message)
|
34
|
+
reflection = self.class._reflect_on_association(association_name)
|
35
|
+
attributes_collection = attributes_collection.map do |attributes|
|
36
|
+
reflection.klass.attributes_from_proto(attributes)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
super(association_name, attributes_collection)
|
41
|
+
end
|
42
|
+
|
43
|
+
# :nodoc:
|
44
|
+
def assign_nested_attributes_for_one_to_one_association(association_name, attributes)
|
45
|
+
if attributes.is_a?(::Protobuf::Message)
|
46
|
+
reflection = self.class._reflect_on_association(association_name)
|
47
|
+
attributes = reflection.klass.attributes_from_proto(attributes)
|
48
|
+
end
|
49
|
+
|
50
|
+
super(association_name, attributes)
|
51
|
+
end
|
29
52
|
end
|
30
53
|
end
|
31
54
|
end
|
@@ -33,20 +33,30 @@ module Protobuf
|
|
33
33
|
proto.field?(key) && !field.repeated?
|
34
34
|
end
|
35
35
|
|
36
|
-
filtered_attributes = _filtered_attributes +
|
37
|
-
filtered_attributes += _protobuf_attribute_transformers.keys
|
36
|
+
filtered_attributes = _filtered_attributes + _protobuf_attribute_transformers.keys
|
38
37
|
|
39
38
|
attribute_fields = filtered_attributes.inject({}) do |hash, column_name|
|
40
39
|
symbolized_column = column_name.to_sym
|
41
40
|
|
42
|
-
if fields.has_key?(symbolized_column) ||
|
43
|
-
_protobuf_attribute_transformers.has_key?(symbolized_column)
|
41
|
+
if fields.has_key?(symbolized_column) || _protobuf_attribute_transformers.has_key?(symbolized_column)
|
44
42
|
hash[symbolized_column] = fields[symbolized_column]
|
45
43
|
end
|
46
44
|
|
47
45
|
hash
|
48
46
|
end
|
49
47
|
|
48
|
+
_protobuf_nested_attributes.each do |attribute_name|
|
49
|
+
nested_attribute_name = "#{attribute_name}_attributes".to_sym
|
50
|
+
value = if proto.has_field?(nested_attribute_name)
|
51
|
+
proto.__send__(nested_attribute_name)
|
52
|
+
elsif proto.has_field?(attribute_name)
|
53
|
+
proto.__send__(attribute_name)
|
54
|
+
end
|
55
|
+
|
56
|
+
next unless value
|
57
|
+
attribute_fields[nested_attribute_name] = value
|
58
|
+
end
|
59
|
+
|
50
60
|
attribute_fields
|
51
61
|
end
|
52
62
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Protobuf::ActiveRecord::NestedAttributes do
|
4
|
+
let(:user_message) {
|
5
|
+
UserMessage.new(:name => "foo bar", :email => "foo@test.co", :photos => [{ url: "https://test.co/test.png" }])
|
6
|
+
}
|
7
|
+
|
8
|
+
describe "._filter_attribute_fields", :aggregate_failures => true do
|
9
|
+
it "includes nested attributes" do
|
10
|
+
attribute_fields = User._filter_attribute_fields(user_message)
|
11
|
+
expect(attribute_fields[:photos_attributes]).to eq(user_message.photos)
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when" do
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".new" do
|
20
|
+
context "when a model accepts nested attributes" do
|
21
|
+
it "transforms nested attributes", :aggregate_failures => true do
|
22
|
+
user_message.photos.each do |photo_message|
|
23
|
+
expect(Photo).to receive(:attributes_from_proto).with(photo_message).and_call_original
|
24
|
+
end
|
25
|
+
User.new(user_message)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -9,7 +9,7 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
9
9
|
let(:protobuf_message) { UserMessage }
|
10
10
|
|
11
11
|
describe ".field_from_record" do
|
12
|
-
context "when the given
|
12
|
+
context "when the given transformer is a symbol" do
|
13
13
|
before { User.field_from_record :first_name, :extract_first_name }
|
14
14
|
|
15
15
|
it "creates a symbol transformer from the converter" do
|
@@ -17,7 +17,7 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
context "when the given
|
20
|
+
context "when the given transformer is not callable" do
|
21
21
|
it "raises an exception" do
|
22
22
|
expect { User.field_from_record :name, nil }.to raise_exception(Protobuf::ActiveRecord::FieldTransformerError)
|
23
23
|
end
|
@@ -31,9 +31,8 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
31
31
|
User.field_from_record :account_id, callable
|
32
32
|
}
|
33
33
|
|
34
|
-
it "adds the given converter to the list of protobuf field transformers"
|
35
|
-
User._protobuf_field_transformers[:account_id]
|
36
|
-
fail
|
34
|
+
it "adds the given converter to the list of protobuf field transformers" do
|
35
|
+
expect(User._protobuf_field_transformers[:account_id]).to eq(callable)
|
37
36
|
end
|
38
37
|
end
|
39
38
|
end
|
@@ -78,26 +77,26 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
78
77
|
context "when options has :except" do
|
79
78
|
it "returns all except the given field(s)" do
|
80
79
|
fields = user._filter_field_attributes(:except => :name)
|
81
|
-
expect(fields).to match_array([ :guid, :email, :email_domain, :password, :nullify ])
|
80
|
+
expect(fields).to match_array([ :guid, :email, :email_domain, :password, :nullify, :photos ])
|
82
81
|
end
|
83
82
|
end
|
84
83
|
end
|
85
84
|
|
86
85
|
describe "#_filtered_fields" do
|
87
86
|
it "returns protobuf fields" do
|
88
|
-
expect(user._filtered_fields).to match_array([ :guid, :name, :email, :email_domain, :password, :nullify ])
|
87
|
+
expect(user._filtered_fields).to match_array([ :guid, :name, :email, :email_domain, :password, :nullify, :photos ])
|
89
88
|
end
|
90
89
|
|
91
90
|
context "given :deprecated => false" do
|
92
91
|
it "filters all deprecated fields" do
|
93
92
|
fields = user._filtered_fields(:deprecated => false)
|
94
|
-
expect(fields).to match_array([ :guid, :name, :email, :password, :nullify ])
|
93
|
+
expect(fields).to match_array([ :guid, :name, :email, :password, :nullify, :photos ])
|
95
94
|
end
|
96
95
|
|
97
96
|
context 'and :include => :email_domain' do
|
98
97
|
it 'includes deprecated fields that have been explicitly specified' do
|
99
98
|
fields = user._filtered_fields(:deprecated => false, :include => :email_domain)
|
100
|
-
expect(fields).to match_array([ :guid, :name, :email, :email_domain, :password, :nullify ])
|
99
|
+
expect(fields).to match_array([ :guid, :name, :email, :email_domain, :password, :nullify, :photos ])
|
101
100
|
end
|
102
101
|
end
|
103
102
|
end
|
@@ -155,23 +154,8 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
155
154
|
}
|
156
155
|
|
157
156
|
context "when a transformer is defined for the field" do
|
158
|
-
let(:fields_from_record) { { :guid => user.guid, :name => user.name, :email => user.email, :email_domain => 'test.co', :password => nil, :nullify => nil } }
|
159
|
-
|
160
157
|
it "gets the field from the transformer" do
|
161
|
-
expect(user.fields_from_record).to eq
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
context "when a transformer is not defined for the field" do
|
166
|
-
let(:fields_from_record) { { :guid => user.guid, :name => user.name, :email => user.email, :email_domain => nil, :password => nil, :nullify => nil } }
|
167
|
-
|
168
|
-
before {
|
169
|
-
user.to_proto
|
170
|
-
allow(user).to receive(:_protobuf_active_record_serialize_email_domain).and_return(nil)
|
171
|
-
}
|
172
|
-
|
173
|
-
it "returns a hash of protobuf fields that this object has getters for" do
|
174
|
-
expect(user.fields_from_record).to eq fields_from_record
|
158
|
+
expect(user.fields_from_record[:email_domain]).to eq('test.co')
|
175
159
|
end
|
176
160
|
end
|
177
161
|
|
@@ -201,14 +201,11 @@ describe Protobuf::ActiveRecord::Transformation do
|
|
201
201
|
context "when the given transformer is callable" do
|
202
202
|
let(:callable) { lambda { |proto| nil } }
|
203
203
|
|
204
|
-
before {
|
205
|
-
allow(User).to receive(:_protobuf_attribute_transformers).and_return(Hash.new)
|
206
|
-
User.attribute_from_proto :account_id, callable
|
207
|
-
}
|
204
|
+
before { allow(User).to receive(:_protobuf_attribute_transformers).and_return(Hash.new) }
|
208
205
|
|
209
|
-
it "adds the given converter to the list of protobuf field transformers"
|
210
|
-
User.
|
211
|
-
|
206
|
+
it "adds the given converter to the list of protobuf field transformers" do
|
207
|
+
User.attribute_from_proto :account_id, callable
|
208
|
+
expect(User._protobuf_attribute_transformers[:account_id].callable).to eq callable
|
212
209
|
end
|
213
210
|
end
|
214
211
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler"
|
3
3
|
|
4
|
-
require
|
4
|
+
require "simplecov"
|
5
5
|
SimpleCov.start do
|
6
|
-
add_filter
|
6
|
+
add_filter "/spec/"
|
7
7
|
end
|
8
8
|
|
9
9
|
Bundler.require(:default, :development, :test)
|
10
10
|
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
11
|
+
require "support/db"
|
12
|
+
require "support/models"
|
13
|
+
require "support/protobuf/messages.pb"
|
14
14
|
|
15
|
-
# Silence protobuf
|
16
|
-
|
15
|
+
# Silence protobuf"s logger
|
16
|
+
Protobuf::Logging.logger.level = ::Logger::FATAL
|
17
17
|
|
18
18
|
RSpec.configure do |config|
|
19
19
|
# Turn deprecation warnings into errors with full backtrace.
|
data/spec/support/db/setup.rb
CHANGED
@@ -10,6 +10,13 @@ ActiveRecord::Base.connection.tables.each do |table|
|
|
10
10
|
end
|
11
11
|
|
12
12
|
ActiveRecord::Schema.define(:version => 1) do
|
13
|
+
create_table :photos do |t|
|
14
|
+
t.string :url
|
15
|
+
t.integer :user_id
|
16
|
+
|
17
|
+
t.timestamps null: false
|
18
|
+
end
|
19
|
+
|
13
20
|
create_table :users do |t|
|
14
21
|
t.string :guid
|
15
22
|
t.string :first_name
|
@@ -17,6 +24,6 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
17
24
|
t.string :email
|
18
25
|
t.integer :account_id
|
19
26
|
|
20
|
-
t.timestamps
|
27
|
+
t.timestamps null: false
|
21
28
|
end
|
22
29
|
end
|
@@ -1,3 +1,8 @@
|
|
1
|
+
message PhotoMessage {
|
2
|
+
optional string url = 1;
|
3
|
+
optional int64 user_guid = 2;
|
4
|
+
}
|
5
|
+
|
1
6
|
message UserMessage {
|
2
7
|
optional string guid = 1;
|
3
8
|
optional string name = 2;
|
@@ -5,6 +10,7 @@ message UserMessage {
|
|
5
10
|
optional string email_domain = 4 [deprecated = true];
|
6
11
|
optional string password = 5;
|
7
12
|
repeated string nullify = 6;
|
13
|
+
repeated PhotoMessage photos = 7;
|
8
14
|
}
|
9
15
|
|
10
16
|
message UserSearchMessage {
|
data/spec/support/models.rb
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
require 'support/models/
|
1
|
+
require 'support/models/photo'
|
2
|
+
require 'support/models/user'
|
data/spec/support/models/user.rb
CHANGED
@@ -3,9 +3,15 @@ class User < ActiveRecord::Base
|
|
3
3
|
|
4
4
|
attr_accessor :password
|
5
5
|
|
6
|
+
has_many :photos
|
7
|
+
|
8
|
+
accepts_nested_attributes_for :photos
|
9
|
+
|
6
10
|
scope :by_guid, lambda { |*guids| where(:guid => guids) }
|
7
11
|
scope :by_email, lambda { |*emails| where(:email => emails) }
|
8
12
|
|
13
|
+
protobuf_fields :except => :photos
|
14
|
+
|
9
15
|
attribute_from_proto :first_name, :extract_first_name
|
10
16
|
attribute_from_proto :last_name, :extract_last_name
|
11
17
|
attribute_from_proto :password, lambda { |proto| proto.password! }
|
@@ -1,12 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
##
|
2
4
|
# This file is auto-generated. DO NOT EDIT!
|
3
5
|
#
|
4
|
-
require 'protobuf
|
6
|
+
require 'protobuf'
|
5
7
|
|
6
8
|
|
7
9
|
##
|
8
10
|
# Message Classes
|
9
11
|
#
|
12
|
+
class PhotoMessage < ::Protobuf::Message; end
|
10
13
|
class UserMessage < ::Protobuf::Message; end
|
11
14
|
class UserSearchMessage < ::Protobuf::Message; end
|
12
15
|
|
@@ -14,6 +17,11 @@ class UserSearchMessage < ::Protobuf::Message; end
|
|
14
17
|
##
|
15
18
|
# Message Fields
|
16
19
|
#
|
20
|
+
class PhotoMessage
|
21
|
+
optional :string, :url, 1
|
22
|
+
optional :int64, :user_guid, 2
|
23
|
+
end
|
24
|
+
|
17
25
|
class UserMessage
|
18
26
|
optional :string, :guid, 1
|
19
27
|
optional :string, :name, 2
|
@@ -21,6 +29,7 @@ class UserMessage
|
|
21
29
|
optional :string, :email_domain, 4, :deprecated => true
|
22
30
|
optional :string, :password, 5
|
23
31
|
repeated :string, :nullify, 6
|
32
|
+
repeated ::PhotoMessage, :photos, 7
|
24
33
|
end
|
25
34
|
|
26
35
|
class UserSearchMessage
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protobuf-activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.4.
|
4
|
+
version: 3.4.4.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Hutchison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -216,6 +216,7 @@ files:
|
|
216
216
|
- lib/protobuf/active_record/version.rb
|
217
217
|
- protobuf-activerecord.gemspec
|
218
218
|
- spec/protobuf/active_record/columns_spec.rb
|
219
|
+
- spec/protobuf/active_record/nested_attributes_spec.rb
|
219
220
|
- spec/protobuf/active_record/persistence_spec.rb
|
220
221
|
- spec/protobuf/active_record/scope_spec.rb
|
221
222
|
- spec/protobuf/active_record/serialization_spec.rb
|
@@ -224,11 +225,11 @@ files:
|
|
224
225
|
- spec/spec_helper.rb
|
225
226
|
- spec/support/db.rb
|
226
227
|
- spec/support/db/setup.rb
|
227
|
-
- spec/support/definitions/
|
228
|
+
- spec/support/definitions/messages.proto
|
228
229
|
- spec/support/models.rb
|
230
|
+
- spec/support/models/photo.rb
|
229
231
|
- spec/support/models/user.rb
|
230
|
-
- spec/support/protobuf.rb
|
231
|
-
- spec/support/protobuf/user.pb.rb
|
232
|
+
- spec/support/protobuf/messages.pb.rb
|
232
233
|
homepage: http://github.com/liveh2o/protobuf-activerecord
|
233
234
|
licenses:
|
234
235
|
- MIT
|
@@ -244,17 +245,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
244
245
|
version: '0'
|
245
246
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
246
247
|
requirements:
|
247
|
-
- - "
|
248
|
+
- - ">"
|
248
249
|
- !ruby/object:Gem::Version
|
249
|
-
version:
|
250
|
+
version: 1.3.1
|
250
251
|
requirements: []
|
251
252
|
rubyforge_project:
|
252
|
-
rubygems_version: 2.6.
|
253
|
+
rubygems_version: 2.6.13
|
253
254
|
signing_key:
|
254
255
|
specification_version: 4
|
255
256
|
summary: Google Protocol Buffers integration for Active Record
|
256
257
|
test_files:
|
257
258
|
- spec/protobuf/active_record/columns_spec.rb
|
259
|
+
- spec/protobuf/active_record/nested_attributes_spec.rb
|
258
260
|
- spec/protobuf/active_record/persistence_spec.rb
|
259
261
|
- spec/protobuf/active_record/scope_spec.rb
|
260
262
|
- spec/protobuf/active_record/serialization_spec.rb
|
@@ -263,8 +265,8 @@ test_files:
|
|
263
265
|
- spec/spec_helper.rb
|
264
266
|
- spec/support/db.rb
|
265
267
|
- spec/support/db/setup.rb
|
266
|
-
- spec/support/definitions/
|
268
|
+
- spec/support/definitions/messages.proto
|
267
269
|
- spec/support/models.rb
|
270
|
+
- spec/support/models/photo.rb
|
268
271
|
- spec/support/models/user.rb
|
269
|
-
- spec/support/protobuf.rb
|
270
|
-
- spec/support/protobuf/user.pb.rb
|
272
|
+
- spec/support/protobuf/messages.pb.rb
|
data/spec/support/protobuf.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'support/protobuf/user.pb'
|