protobuf-activerecord 3.6.0 → 3.6.1
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 +4 -4
- data/.rubocop.yml +28 -0
- data/.travis.yml +2 -5
- data/Gemfile +1 -1
- data/Rakefile +10 -6
- data/lib/protobuf-activerecord.rb +15 -13
- data/lib/protobuf/active_record/attribute_methods.rb +2 -2
- data/lib/protobuf/active_record/columns.rb +4 -4
- data/lib/protobuf/active_record/mass_assignment_security.rb +3 -3
- data/lib/protobuf/active_record/mass_assignment_security/persistence.rb +3 -3
- data/lib/protobuf/active_record/mass_assignment_security/transformation.rb +1 -1
- data/lib/protobuf/active_record/middleware/connection_management_async.rb +9 -4
- data/lib/protobuf/active_record/model.rb +10 -10
- data/lib/protobuf/active_record/persistence.rb +1 -1
- data/lib/protobuf/active_record/scope.rb +2 -2
- data/lib/protobuf/active_record/serialization.rb +14 -23
- data/lib/protobuf/active_record/transformation.rb +9 -10
- data/lib/protobuf/active_record/transformer.rb +1 -3
- data/lib/protobuf/active_record/validations.rb +2 -2
- data/lib/protobuf/active_record/version.rb +1 -1
- data/protobuf-activerecord.gemspec +9 -7
- data/spec/protobuf/active_record/columns_spec.rb +6 -6
- data/spec/protobuf/active_record/nested_attributes_spec.rb +1 -2
- data/spec/protobuf/active_record/persistence_spec.rb +3 -3
- data/spec/protobuf/active_record/scope_spec.rb +6 -7
- data/spec/protobuf/active_record/serialization_spec.rb +22 -14
- data/spec/protobuf/active_record/transformation_spec.rb +19 -19
- data/spec/protobuf/active_record/transformer_spec.rb +13 -13
- data/spec/support/db.rb +1 -1
- data/spec/support/db/setup.rb +3 -3
- data/spec/support/definitions/messages.proto +11 -7
- data/spec/support/models.rb +2 -2
- data/spec/support/models/user.rb +7 -1
- data/spec/support/protobuf/messages.pb.rb +2 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c25dac0d341a98ef1a2063256abf9d20b2752f58280dfe32bd45a4e273fec2d0
|
4
|
+
data.tar.gz: 77d0019eb2a66d0938beb272b773354f1d4fe55faf0b1390c908a44092dd4937
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0febfd5d96839e78688ad1b9700a07063f37a1b6f3f9f8e0e8d643a65541192f88d36c6fb8cd28b219539d9c3a02e67cf57f6e5bfc5f7e3846f9c5aff3b79c39
|
7
|
+
data.tar.gz: b534f6c7b313dac85bf4002f425d29e3be14b027ddbba2ea4b8be7b9e0187bfe400b327593d961f7c6b73276e5a6ebd08163473236c1f811a2746881f764a5d8
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Styles are inherited from Mad Rubocop
|
2
|
+
|
3
|
+
inherit_gem:
|
4
|
+
mad_rubocop: .rubocop.yml
|
5
|
+
|
6
|
+
# Styles that are modified from the defaults
|
7
|
+
AllCops:
|
8
|
+
TargetRubyVersion: 2.5
|
9
|
+
Exclude:
|
10
|
+
- "**/*.pb.rb"
|
11
|
+
|
12
|
+
Style/BlockDelimiters:
|
13
|
+
Description: >-
|
14
|
+
Avoid using {...} for multi-line blocks (multiline chaining is always ugly).
|
15
|
+
Prefer {...} over do...end for single-line blocks.
|
16
|
+
Exclude:
|
17
|
+
- "spec/**/*"
|
18
|
+
|
19
|
+
Style/HashSyntax:
|
20
|
+
Description: >-
|
21
|
+
Prefer Ruby 1.8 hash syntax { :a => 1, :b => 2 } over 1.9 syntax { a: 1, b: 2 }.
|
22
|
+
EnforcedStyle: hash_rockets
|
23
|
+
Exclude:
|
24
|
+
- "Gemfile"
|
25
|
+
|
26
|
+
Layout/SpaceAroundOperators:
|
27
|
+
Exclude:
|
28
|
+
- "*.gemspec"
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,20 +1,24 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
require "protobuf/tasks"
|
2
3
|
require "rspec/core/rake_task"
|
4
|
+
require "rubocop/rake_task"
|
5
|
+
|
6
|
+
desc "Run cops"
|
7
|
+
::RuboCop::RakeTask.new(:rubocop)
|
3
8
|
|
4
9
|
desc "Run specs"
|
5
|
-
RSpec::Core::RakeTask.new(:spec)
|
10
|
+
::RSpec::Core::RakeTask.new(:spec)
|
6
11
|
|
7
|
-
desc "Run specs (default)"
|
8
|
-
task :default => :spec
|
12
|
+
desc "Run cops and specs (default)"
|
13
|
+
task :default => [:rubocop, :spec]
|
9
14
|
|
10
15
|
desc "Remove protobuf definitions that have been compiled"
|
11
16
|
task :clean do
|
12
|
-
FileUtils.rm(Dir.glob("spec/support/protobuf/**/*.proto"))
|
17
|
+
::FileUtils.rm(Dir.glob("spec/support/protobuf/**/*.proto"))
|
13
18
|
puts "Cleaned"
|
14
19
|
end
|
15
20
|
|
16
21
|
desc "Compile spec/support protobuf definitions"
|
17
22
|
task :compile, [] => :clean do
|
18
|
-
|
19
|
-
sh(cmd)
|
23
|
+
::Rake::Task["protobuf:compile"].invoke("", "spec/support/definitions", "spec/support/protobuf")
|
20
24
|
end
|
@@ -1,22 +1,23 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
# rubocop:disable Naming/FileName
|
2
|
+
require "active_record"
|
3
|
+
require "active_support/concern"
|
4
|
+
require "heredity"
|
5
|
+
require "protobuf"
|
5
6
|
|
6
7
|
# To support Rails 4 apps that use Mass-Assignment Security, attempt to
|
7
8
|
# load the protected_attributes gem. If it's not present, move along...
|
8
9
|
begin
|
9
|
-
require
|
10
|
-
rescue LoadError
|
10
|
+
require "protected_attributes"
|
11
|
+
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
11
12
|
# These aren't the droids you're looking for... move along.
|
12
13
|
end
|
13
14
|
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
15
|
+
require "protobuf/active_record/config"
|
16
|
+
require "protobuf/active_record/middleware/connection_management"
|
17
|
+
require "protobuf/active_record/middleware/connection_management_async"
|
18
|
+
require "protobuf/active_record/middleware/query_cache"
|
19
|
+
require "protobuf/active_record/model"
|
20
|
+
require "protobuf/active_record/version"
|
20
21
|
|
21
22
|
module Protobuf
|
22
23
|
module ActiveRecord
|
@@ -29,4 +30,5 @@ module Protobuf
|
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
|
-
require
|
33
|
+
require "protobuf/active_record/railtie" if defined?(Rails)
|
34
|
+
# rubocop:enable Naming/FileName
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/concern"
|
2
2
|
|
3
3
|
module Protobuf
|
4
4
|
module ActiveRecord
|
@@ -22,7 +22,7 @@ module Protobuf
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
def fetch_field_alias_from_record(attribute,
|
25
|
+
def fetch_field_alias_from_record(attribute, _field_aliasd)
|
26
26
|
lambda do |record|
|
27
27
|
value = record.__send__(field_alias)
|
28
28
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "set"
|
2
|
+
require "active_support/concern"
|
3
|
+
require "thread"
|
4
4
|
|
5
5
|
module Protobuf
|
6
6
|
module ActiveRecord
|
@@ -63,7 +63,7 @@ module Protobuf
|
|
63
63
|
return if _protobuf_mapped_columns?
|
64
64
|
|
65
65
|
@_protobuf_columns = {}
|
66
|
-
@_protobuf_column_types = ::Hash.new { |h,k| h[k] = ::Set.new }
|
66
|
+
@_protobuf_column_types = ::Hash.new { |h, k| h[k] = ::Set.new }
|
67
67
|
@_protobuf_date_datetime_time_or_timestamp_column = ::Set.new
|
68
68
|
|
69
69
|
columns.map do |column|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "active_support/concern"
|
2
|
+
require "protobuf/active_record/mass_assignment_security/persistence"
|
3
|
+
require "protobuf/active_record/mass_assignment_security/transformation"
|
4
4
|
|
5
5
|
module Protobuf
|
6
6
|
module ActiveRecord
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/concern"
|
2
2
|
|
3
3
|
module Protobuf
|
4
4
|
module ActiveRecord
|
@@ -8,14 +8,14 @@ module Protobuf
|
|
8
8
|
|
9
9
|
module ClassMethods
|
10
10
|
# :nodoc:
|
11
|
-
def create(attributes, options = {}
|
11
|
+
def create(attributes, options = {})
|
12
12
|
attributes = attributes_from_proto(attributes) if attributes.is_a?(::Protobuf::Message)
|
13
13
|
|
14
14
|
super(attributes, options)
|
15
15
|
end
|
16
16
|
|
17
17
|
# :nodoc:
|
18
|
-
def create!(attributes, options = {}
|
18
|
+
def create!(attributes, options = {})
|
19
19
|
attributes = attributes_from_proto(attributes) if attributes.is_a?(::Protobuf::Message)
|
20
20
|
|
21
21
|
super(attributes, options)
|
@@ -12,10 +12,11 @@ module Protobuf
|
|
12
12
|
START_MUTEX.synchronize do
|
13
13
|
return if timed_task_started.true?
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
args = {
|
16
|
+
:execution_interval => ::Protobuf::ActiveRecord.config.connection_reaping_interval,
|
17
|
+
:timeout_interval => ::Protobuf::ActiveRecord.config.connection_reaping_timeout_interval
|
18
|
+
}
|
19
|
+
timed_task = ::Concurrent::TimerTask.new(args) do
|
19
20
|
::ActiveRecord::Base.clear_active_connections!
|
20
21
|
end
|
21
22
|
|
@@ -37,6 +38,8 @@ module Protobuf
|
|
37
38
|
@app = app
|
38
39
|
end
|
39
40
|
|
41
|
+
# rubocop:disable Lint/DuplicateMethods
|
42
|
+
# rubocop:disable Lint/NestedMethodDefinition
|
40
43
|
def call(env)
|
41
44
|
def call(env)
|
42
45
|
::ActiveRecord::Base.connection_pool.with_connection do
|
@@ -47,6 +50,8 @@ module Protobuf
|
|
47
50
|
self.class.start_timed_task!
|
48
51
|
call(env)
|
49
52
|
end
|
53
|
+
# rubocop:enable Lint/NestedMethodDefinition
|
54
|
+
# rubocop:enable Lint/DuplicateMethods
|
50
55
|
|
51
56
|
timed_task_started
|
52
57
|
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
1
|
+
require "protobuf/active_record/attribute_methods"
|
2
|
+
require "protobuf/active_record/columns"
|
3
|
+
require "protobuf/active_record/errors"
|
4
|
+
require "protobuf/active_record/mass_assignment_security"
|
5
|
+
require "protobuf/active_record/nested_attributes"
|
6
|
+
require "protobuf/active_record/persistence"
|
7
|
+
require "protobuf/active_record/scope"
|
8
|
+
require "protobuf/active_record/serialization"
|
9
|
+
require "protobuf/active_record/transformation"
|
10
|
+
require "protobuf/active_record/validations"
|
11
11
|
|
12
12
|
module Protobuf
|
13
13
|
module ActiveRecord
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/concern"
|
2
2
|
|
3
3
|
module Protobuf
|
4
4
|
module ActiveRecord
|
@@ -73,7 +73,7 @@ module Protobuf
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
values = [
|
76
|
+
values = [value].flatten
|
77
77
|
values.map!(&:to_i) if proto.class.get_field(field, true).enum?
|
78
78
|
values
|
79
79
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "set"
|
2
|
+
require "active_support/concern"
|
3
3
|
|
4
4
|
module Protobuf
|
5
5
|
module ActiveRecord
|
@@ -13,10 +13,6 @@ module Protobuf
|
|
13
13
|
:_protobuf_field_options,
|
14
14
|
:protobuf_message
|
15
15
|
end
|
16
|
-
|
17
|
-
private :_protobuf_field_symbol_transformers
|
18
|
-
private :_protobuf_field_transformers
|
19
|
-
private :_protobuf_message
|
20
16
|
end
|
21
17
|
|
22
18
|
module ClassMethods
|
@@ -169,8 +165,6 @@ module Protobuf
|
|
169
165
|
|
170
166
|
if value
|
171
167
|
value.to_time(:utc).to_i
|
172
|
-
else
|
173
|
-
nil
|
174
168
|
end
|
175
169
|
rescue NameError # Has happened when field is not on model or ignored from db
|
176
170
|
return nil
|
@@ -185,11 +179,7 @@ module Protobuf
|
|
185
179
|
def call(selph)
|
186
180
|
value = selph.__send__(@field)
|
187
181
|
|
188
|
-
|
189
|
-
value.to_i
|
190
|
-
else
|
191
|
-
nil
|
192
|
-
end
|
182
|
+
value&.to_i
|
193
183
|
rescue NameError # Has happened when field is not on model or ignored from db
|
194
184
|
return nil
|
195
185
|
end
|
@@ -227,14 +217,15 @@ module Protobuf
|
|
227
217
|
end
|
228
218
|
|
229
219
|
class NilMethodCaller
|
230
|
-
def initialize
|
220
|
+
def initialize
|
221
|
+
end
|
231
222
|
|
232
|
-
def call(
|
223
|
+
def call(_selph)
|
233
224
|
nil
|
234
225
|
end
|
235
226
|
end
|
236
227
|
|
237
|
-
def _protobuf_nil_object(
|
228
|
+
def _protobuf_nil_object(_field)
|
238
229
|
NilMethodCaller.new
|
239
230
|
end
|
240
231
|
|
@@ -250,7 +241,7 @@ module Protobuf
|
|
250
241
|
end
|
251
242
|
|
252
243
|
def _protobuf_symbol_transformer_object(field)
|
253
|
-
FieldSymbolTransformerCaller.new(self,
|
244
|
+
FieldSymbolTransformerCaller.new(self, _protobuf_field_symbol_transformers[field])
|
254
245
|
end
|
255
246
|
end
|
256
247
|
|
@@ -259,8 +250,8 @@ module Protobuf
|
|
259
250
|
options = _normalize_options(options)
|
260
251
|
|
261
252
|
fields = _filtered_fields(options)
|
262
|
-
fields &= [
|
263
|
-
fields -= [
|
253
|
+
fields &= [options[:only]].flatten if options[:only].present?
|
254
|
+
fields -= [options[:except]].flatten if options[:except].present?
|
264
255
|
|
265
256
|
fields
|
266
257
|
end
|
@@ -312,7 +303,7 @@ module Protobuf
|
|
312
303
|
|
313
304
|
# Already flattened / compacted / uniqued ... unless we must include
|
314
305
|
if options[:include].present?
|
315
|
-
field_attributes.concat([
|
306
|
+
field_attributes.concat([options[:include]].flatten)
|
316
307
|
field_attributes.compact!
|
317
308
|
field_attributes.uniq!
|
318
309
|
end
|
@@ -336,9 +327,9 @@ module Protobuf
|
|
336
327
|
def _protobuf_field_objects(field)
|
337
328
|
self.class._protobuf_field_objects[field] ||= begin
|
338
329
|
case
|
339
|
-
when _protobuf_field_symbol_transformers.
|
330
|
+
when _protobuf_field_symbol_transformers.key?(field) then
|
340
331
|
self.class._protobuf_symbol_transformer_object(field)
|
341
|
-
when _protobuf_field_transformers.
|
332
|
+
when _protobuf_field_transformers.key?(field) then
|
342
333
|
self.class._protobuf_field_transformer_object(field)
|
343
334
|
when respond_to?(field) then
|
344
335
|
if _is_collection_association?(field)
|
@@ -369,7 +360,7 @@ module Protobuf
|
|
369
360
|
|
370
361
|
# :nodoc:
|
371
362
|
def to_proto(options = {})
|
372
|
-
raise MessageNotDefined
|
363
|
+
raise MessageNotDefined, self.class if _protobuf_message.nil?
|
373
364
|
|
374
365
|
fields = self.fields_from_record(options)
|
375
366
|
_protobuf_message.new(fields)
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "active_support/concern"
|
2
|
+
require "heredity/inheritable_class_instance_variables"
|
3
|
+
require "protobuf/active_record/transformer"
|
4
4
|
|
5
5
|
module Protobuf
|
6
6
|
module ActiveRecord
|
@@ -28,7 +28,7 @@ module Protobuf
|
|
28
28
|
# :nodoc:
|
29
29
|
def _filter_attribute_fields(proto)
|
30
30
|
fields = proto.to_hash
|
31
|
-
fields.select! do |key,
|
31
|
+
fields.select! do |key, _value|
|
32
32
|
field = proto.class.get_field(key, true)
|
33
33
|
proto.field?(key) && !field.repeated?
|
34
34
|
end
|
@@ -38,7 +38,7 @@ module Protobuf
|
|
38
38
|
attribute_fields = filtered_attributes.inject({}) do |hash, column_name|
|
39
39
|
symbolized_column = column_name.to_sym
|
40
40
|
|
41
|
-
if fields.
|
41
|
+
if fields.key?(symbolized_column) || _protobuf_attribute_transformers.key?(symbolized_column)
|
42
42
|
hash[symbolized_column] = fields[symbolized_column]
|
43
43
|
end
|
44
44
|
|
@@ -47,9 +47,9 @@ module Protobuf
|
|
47
47
|
|
48
48
|
_protobuf_nested_attributes.each do |attribute_name|
|
49
49
|
nested_attribute_name = "#{attribute_name}_attributes".to_sym
|
50
|
-
value = if proto.
|
50
|
+
value = if proto.field?(nested_attribute_name)
|
51
51
|
proto.__send__(nested_attribute_name)
|
52
|
-
elsif proto.
|
52
|
+
elsif proto.field?(attribute_name)
|
53
53
|
proto.__send__(attribute_name)
|
54
54
|
end
|
55
55
|
|
@@ -121,7 +121,7 @@ module Protobuf
|
|
121
121
|
|
122
122
|
if options[:nullify_on]
|
123
123
|
field = protobuf_message.get_field(:nullify)
|
124
|
-
unless field
|
124
|
+
unless field&.is_a?(::Protobuf::Field::StringField) && field&.repeated?
|
125
125
|
::Protobuf::Logging.logger.warn "Message: #{protobuf_message} is not compatible with :nullify_on option"
|
126
126
|
end
|
127
127
|
end
|
@@ -130,7 +130,6 @@ module Protobuf
|
|
130
130
|
_protobuf_attribute_transformers[attribute.to_sym] = transformer
|
131
131
|
end
|
132
132
|
|
133
|
-
|
134
133
|
# Creates a hash of attributes from a given protobuf message.
|
135
134
|
#
|
136
135
|
# It converts and transforms field values using the field converters and
|
@@ -140,7 +139,7 @@ module Protobuf
|
|
140
139
|
attribute_fields = _filter_attribute_fields(proto)
|
141
140
|
|
142
141
|
attributes = attribute_fields.inject({}) do |hash, (key, value)|
|
143
|
-
if _protobuf_attribute_transformers.
|
142
|
+
if _protobuf_attribute_transformers.key?(key)
|
144
143
|
transformer = _protobuf_attribute_transformers[key]
|
145
144
|
attribute = transformer.call(proto)
|
146
145
|
hash[key] = attribute unless attribute.nil?
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
5
|
+
require "protobuf/active_record/version"
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
8
|
spec.name = "protobuf-activerecord"
|
@@ -9,12 +10,12 @@ Gem::Specification.new do |spec|
|
|
9
10
|
spec.authors = ["Adam Hutchison"]
|
10
11
|
spec.email = ["liveh2o@gmail.com"]
|
11
12
|
spec.homepage = "http://github.com/liveh2o/protobuf-activerecord"
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.license =
|
13
|
+
spec.summary = "Google Protocol Buffers integration for Active Record"
|
14
|
+
spec.description = "Provides the ability to create Active Record objects from Protocol Buffer messages and vice versa."
|
15
|
+
spec.license = "MIT"
|
15
16
|
|
16
|
-
spec.files = `git ls-files`.split(
|
17
|
-
spec.executables = spec.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
18
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
20
|
spec.require_paths = ["lib"]
|
20
21
|
|
@@ -31,6 +32,7 @@ Gem::Specification.new do |spec|
|
|
31
32
|
# Development dependencies
|
32
33
|
#
|
33
34
|
spec.add_development_dependency "benchmark-ips"
|
35
|
+
spec.add_development_dependency "mad_rubocop"
|
34
36
|
spec.add_development_dependency "rake"
|
35
37
|
spec.add_development_dependency "rspec", ">= 3.3.0"
|
36
38
|
spec.add_development_dependency "rspec-pride", ">= 3.1.0"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Protobuf::ActiveRecord::Columns do
|
4
4
|
describe "._protobuf_map_columns" do
|
@@ -31,10 +31,10 @@ describe Protobuf::ActiveRecord::Columns do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
context "column type predicates" do
|
34
|
-
before { allow(User).to receive(:_protobuf_column_types).and_return(
|
34
|
+
before { allow(User).to receive(:_protobuf_column_types).and_return({}) }
|
35
35
|
|
36
36
|
describe "._protobuf_date_column?" do
|
37
|
-
before { User._protobuf_column_types[:date] = [
|
37
|
+
before { User._protobuf_column_types[:date] = [:foo_date] }
|
38
38
|
|
39
39
|
context "when the column type is :date" do
|
40
40
|
it "is true" do
|
@@ -50,7 +50,7 @@ describe Protobuf::ActiveRecord::Columns do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
describe "._protobuf_datetime_column?" do
|
53
|
-
before { User._protobuf_column_types[:datetime] = [
|
53
|
+
before { User._protobuf_column_types[:datetime] = [:foo_datetime] }
|
54
54
|
|
55
55
|
context "when the column type is :datetime" do
|
56
56
|
it "is true" do
|
@@ -66,7 +66,7 @@ describe Protobuf::ActiveRecord::Columns do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
describe "._protobuf_time_column?" do
|
69
|
-
before { User._protobuf_column_types[:time] = [
|
69
|
+
before { User._protobuf_column_types[:time] = [:foo_time] }
|
70
70
|
|
71
71
|
context "when the column type is :time" do
|
72
72
|
it "is true" do
|
@@ -82,7 +82,7 @@ describe Protobuf::ActiveRecord::Columns do
|
|
82
82
|
end
|
83
83
|
|
84
84
|
describe "._protobuf_timestamp_column?" do
|
85
|
-
before { User._protobuf_column_types[:timestamp] = [
|
85
|
+
before { User._protobuf_column_types[:timestamp] = [:foo_timestamp] }
|
86
86
|
|
87
87
|
context "when the column type is :timestamp" do
|
88
88
|
it "is true" do
|
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Protobuf::ActiveRecord::NestedAttributes do
|
4
4
|
let(:user_message) {
|
5
|
-
UserMessage.new(:name => "foo bar", :email => "foo@test.co", :photos => [{ url
|
5
|
+
UserMessage.new(:name => "foo bar", :email => "foo@test.co", :photos => [{ :url => "https://test.co/test.png" }])
|
6
6
|
}
|
7
7
|
|
8
8
|
describe "._filter_attribute_fields", :aggregate_failures => true do
|
@@ -12,7 +12,6 @@ describe Protobuf::ActiveRecord::NestedAttributes do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
context "when" do
|
15
|
-
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Protobuf::ActiveRecord::Persistence do
|
4
4
|
let(:user) { User.new(user_attributes) }
|
5
|
-
let(:user_attributes) { { :first_name =>
|
6
|
-
let(:proto_hash) { { :name =>
|
5
|
+
let(:user_attributes) { { :first_name => "foo", :last_name => "bar", :email => "foo@test.co" } }
|
6
|
+
let(:proto_hash) { { :name => "foo bar", :email => "foo@test.co" } }
|
7
7
|
let(:proto) { UserMessage.new(proto_hash) }
|
8
8
|
|
9
9
|
describe ".create" do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Protobuf::ActiveRecord::Scope do
|
4
4
|
before do
|
@@ -12,16 +12,15 @@ describe Protobuf::ActiveRecord::Scope do
|
|
12
12
|
User.instance_variable_set("@_upsert_keys", [])
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
15
|
describe ".search_scope" do
|
17
16
|
let(:request) { UserSearchMessage.new(:guid => ["foo"], :email => ["foo@test.co"]) }
|
18
17
|
|
19
18
|
before {
|
20
|
-
allow(User).to receive(:searchable_field_parsers).and_return(
|
19
|
+
allow(User).to receive(:searchable_field_parsers).and_return(:email => proc { |val| val })
|
21
20
|
}
|
22
21
|
|
23
22
|
it "builds scopes for searchable fields" do
|
24
|
-
allow(User).to receive(:searchable_fields).and_return(
|
23
|
+
allow(User).to receive(:searchable_fields).and_return(:email => :by_email)
|
25
24
|
expect(User.search_scope(request)).to eq User.by_email("foo@test.co")
|
26
25
|
end
|
27
26
|
|
@@ -33,7 +32,7 @@ describe Protobuf::ActiveRecord::Scope do
|
|
33
32
|
let(:request) { UserSearchMessage.new(:email => ["foo@test.co"]) }
|
34
33
|
|
35
34
|
it "doesn't build a scope from that field" do
|
36
|
-
allow(User).to receive(:searchable_fields).and_return(
|
35
|
+
allow(User).to receive(:searchable_fields).and_return(:email => :by_email)
|
37
36
|
expect(User.search_scope(request)).to eq User.by_email("foo@test.co")
|
38
37
|
end
|
39
38
|
end
|
@@ -42,7 +41,7 @@ describe Protobuf::ActiveRecord::Scope do
|
|
42
41
|
let(:request) { UserSearchMessage.new(:email => ["foo@test.co"]) }
|
43
42
|
|
44
43
|
it "raises an exception" do
|
45
|
-
allow(User).to receive(:searchable_fields).and_return(
|
44
|
+
allow(User).to receive(:searchable_fields).and_return(:email => :by_hullabaloo)
|
46
45
|
expect { User.search_scope(request) }.to raise_exception(/undefined method .*by_hullabaloo/i)
|
47
46
|
end
|
48
47
|
end
|
@@ -92,7 +91,7 @@ describe Protobuf::ActiveRecord::Scope do
|
|
92
91
|
let(:proto) { UserSearchMessage.new(:guid => ["foo"]) }
|
93
92
|
|
94
93
|
context "and the parser does not respond to :to_sym" do
|
95
|
-
let(:parser) { double(
|
94
|
+
let(:parser) { double("parser") }
|
96
95
|
|
97
96
|
it "passes the value to the parser" do
|
98
97
|
expect(parser).to receive(:call).with(["foo"])
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
# Used to test calling #to_proto when no protobuf message is configured.
|
4
4
|
class UnconfiguredUser
|
@@ -24,10 +24,10 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
context "when the given transformer is callable" do
|
27
|
-
let(:callable) { lambda { |
|
27
|
+
let(:callable) { lambda { |_proto| nil } }
|
28
28
|
|
29
29
|
before {
|
30
|
-
allow(User).to receive(:_protobuf_field_transformers).and_return(
|
30
|
+
allow(User).to receive(:_protobuf_field_transformers).and_return({})
|
31
31
|
User.field_from_record :account_id, callable
|
32
32
|
}
|
33
33
|
|
@@ -61,7 +61,7 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
context "when protobuf_message is defined" do
|
64
|
-
let(:attributes) {
|
64
|
+
let(:attributes) { {} }
|
65
65
|
let(:user) { User.new(attributes) }
|
66
66
|
|
67
67
|
before { User.protobuf_message(protobuf_message) }
|
@@ -70,40 +70,48 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
70
70
|
context "when options has :only" do
|
71
71
|
it "only returns the given field(s)" do
|
72
72
|
fields = user._filter_field_attributes(:only => :name)
|
73
|
-
expect(fields).to eq [
|
73
|
+
expect(fields).to eq [:name]
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
77
|
context "when options has :except" do
|
78
78
|
it "returns all except the given field(s)" do
|
79
79
|
fields = user._filter_field_attributes(:except => :name)
|
80
|
-
expect(fields).to match_array(
|
80
|
+
expect(fields).to match_array(
|
81
|
+
[:guid, :email, :email_domain, :password, :nullify, :photos, :created_at, :updated_at]
|
82
|
+
)
|
81
83
|
end
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
85
87
|
describe "#_filtered_fields" do
|
86
88
|
it "returns protobuf fields" do
|
87
|
-
expect(user._filtered_fields).to match_array(
|
89
|
+
expect(user._filtered_fields).to match_array(
|
90
|
+
[:guid, :name, :email, :email_domain, :password, :nullify, :photos, :created_at, :updated_at]
|
91
|
+
)
|
88
92
|
end
|
89
93
|
|
90
94
|
context "given :deprecated => false" do
|
91
95
|
it "filters all deprecated fields" do
|
92
96
|
fields = user._filtered_fields(:deprecated => false)
|
93
|
-
expect(fields).to match_array(
|
97
|
+
expect(fields).to match_array(
|
98
|
+
[:guid, :name, :email, :password, :nullify, :photos, :created_at, :updated_at]
|
99
|
+
)
|
94
100
|
end
|
95
101
|
|
96
|
-
context
|
97
|
-
it
|
102
|
+
context "and :include => :email_domain" do
|
103
|
+
it "includes deprecated fields that have been explicitly specified" do
|
98
104
|
fields = user._filtered_fields(:deprecated => false, :include => :email_domain)
|
99
|
-
expect(fields).to match_array(
|
105
|
+
expect(fields).to match_array(
|
106
|
+
[:guid, :name, :email, :email_domain, :password, :nullify, :photos, :created_at, :updated_at]
|
107
|
+
)
|
100
108
|
end
|
101
109
|
end
|
102
110
|
end
|
103
111
|
end
|
104
112
|
|
105
113
|
describe "#_normalize_options" do
|
106
|
-
let(:options) { { :only => [
|
114
|
+
let(:options) { { :only => [:name] } }
|
107
115
|
|
108
116
|
context "given empty options" do
|
109
117
|
before { User.protobuf_message(protobuf_message, options) }
|
@@ -132,7 +140,7 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
132
140
|
end
|
133
141
|
|
134
142
|
context "given options with :except" do
|
135
|
-
let(:options) { { :except => [
|
143
|
+
let(:options) { { :except => [:name] } }
|
136
144
|
|
137
145
|
before { User.protobuf_message(protobuf_message, {}) }
|
138
146
|
|
@@ -155,7 +163,7 @@ describe Protobuf::ActiveRecord::Serialization do
|
|
155
163
|
|
156
164
|
context "when a transformer is defined for the field" do
|
157
165
|
it "gets the field from the transformer" do
|
158
|
-
expect(user.fields_from_record[:email_domain]).to eq(
|
166
|
+
expect(user.fields_from_record[:email_domain]).to eq("test.co")
|
159
167
|
end
|
160
168
|
end
|
161
169
|
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Protobuf::ActiveRecord::Transformation do
|
4
4
|
let(:user) { User.new(user_attributes) }
|
5
|
-
let(:user_attributes) { { :first_name =>
|
6
|
-
let(:proto_hash) { { :name =>
|
5
|
+
let(:user_attributes) { { :first_name => "foo", :last_name => "bar", :email => "foo@test.co" } }
|
6
|
+
let(:proto_hash) { { :name => "foo bar", :email => "foo@test.co" } }
|
7
7
|
let(:proto) { UserMessage.new(proto_hash) }
|
8
8
|
|
9
9
|
describe "._filter_attribute_fields" do
|
@@ -14,18 +14,18 @@ describe Protobuf::ActiveRecord::Transformation do
|
|
14
14
|
|
15
15
|
it "filters repeated fields" do
|
16
16
|
attribute_fields = User._filter_attribute_fields(proto)
|
17
|
-
expect(attribute_fields.
|
17
|
+
expect(attribute_fields.key?(:tags)).to be false
|
18
18
|
end
|
19
19
|
|
20
20
|
it "includes attributes that aren't fields, but have attribute transformers" do
|
21
|
-
allow(User).to receive(:_protobuf_attribute_transformers).and_return(
|
21
|
+
allow(User).to receive(:_protobuf_attribute_transformers).and_return(:account_id => :fetch_account_id)
|
22
22
|
attribute_fields = User._filter_attribute_fields(proto)
|
23
|
-
expect(attribute_fields.
|
23
|
+
expect(attribute_fields.key?(:account_id)).to be true
|
24
24
|
end
|
25
25
|
|
26
26
|
it "includes fields that aren't attributes, but have attribute transformers" do
|
27
27
|
attribute_fields = User._filter_attribute_fields(proto)
|
28
|
-
expect(attribute_fields.
|
28
|
+
expect(attribute_fields.key?(:password)).to be true
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -108,7 +108,7 @@ describe Protobuf::ActiveRecord::Transformation do
|
|
108
108
|
end
|
109
109
|
|
110
110
|
describe ".attributes_from_proto" do
|
111
|
-
let(:callable) { lambda { |
|
111
|
+
let(:callable) { lambda { |_proto| 1 } }
|
112
112
|
let(:transformer) { ::Protobuf::ActiveRecord::Transformer.new(callable) }
|
113
113
|
|
114
114
|
context "when a transformer is defined for the attribute" do
|
@@ -119,12 +119,12 @@ describe Protobuf::ActiveRecord::Transformation do
|
|
119
119
|
end
|
120
120
|
|
121
121
|
context "when a transformer is a callable that returns nil" do
|
122
|
-
let(:callable) { lambda { |
|
122
|
+
let(:callable) { lambda { |_proto| nil } }
|
123
123
|
|
124
124
|
before do
|
125
125
|
transformers = User._protobuf_attribute_transformers
|
126
126
|
allow(User).to receive(:_protobuf_attribute_transformers).and_return(
|
127
|
-
{:account_id => transformer}.merge(transformers)
|
127
|
+
{ :account_id => transformer }.merge(transformers)
|
128
128
|
)
|
129
129
|
end
|
130
130
|
|
@@ -134,15 +134,15 @@ describe Protobuf::ActiveRecord::Transformation do
|
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
137
|
-
context
|
138
|
-
let(:callable) { lambda { |
|
137
|
+
context "when the transformer has a nullify_on option" do
|
138
|
+
let(:callable) { lambda { |_proto| nil } }
|
139
139
|
let(:transformer) { ::Protobuf::ActiveRecord::Transformer.new(callable, :nullify_on => :account_id) }
|
140
|
-
let(:proto_hash) { { :name =>
|
140
|
+
let(:proto_hash) { { :name => "foo bar", :email => "foo@test.co", :nullify => [:account_id] } }
|
141
141
|
|
142
142
|
before do
|
143
143
|
transformers = User._protobuf_attribute_transformers
|
144
144
|
allow(User).to receive(:_protobuf_attribute_transformers).and_return(
|
145
|
-
{:account_id => transformer}.merge(transformers)
|
145
|
+
{ :account_id => transformer }.merge(transformers)
|
146
146
|
)
|
147
147
|
end
|
148
148
|
|
@@ -156,7 +156,7 @@ describe Protobuf::ActiveRecord::Transformation do
|
|
156
156
|
before do
|
157
157
|
transformers = User._protobuf_attribute_transformers
|
158
158
|
allow(User).to receive(:_protobuf_attribute_transformers).and_return(
|
159
|
-
{:account_id => transformer}.merge(transformers)
|
159
|
+
{ :account_id => transformer }.merge(transformers)
|
160
160
|
)
|
161
161
|
end
|
162
162
|
|
@@ -168,7 +168,7 @@ describe Protobuf::ActiveRecord::Transformation do
|
|
168
168
|
|
169
169
|
context "when a transformer is not defined for the attribute" do
|
170
170
|
before {
|
171
|
-
allow(User).to receive(:_protobuf_convert_fields_to_attributes) do |
|
171
|
+
allow(User).to receive(:_protobuf_convert_fields_to_attributes) do |_key, value|
|
172
172
|
value
|
173
173
|
end
|
174
174
|
}
|
@@ -182,7 +182,7 @@ describe Protobuf::ActiveRecord::Transformation do
|
|
182
182
|
|
183
183
|
describe ".attribute_from_proto" do
|
184
184
|
context "when the given transformer is a symbol" do
|
185
|
-
let(:callable) { lambda { |
|
185
|
+
let(:callable) { lambda { |_value| User.__send__(:extract_first_name) } }
|
186
186
|
|
187
187
|
before { User.attribute_from_proto :first_name, :extract_first_name }
|
188
188
|
|
@@ -199,9 +199,9 @@ describe Protobuf::ActiveRecord::Transformation do
|
|
199
199
|
end
|
200
200
|
|
201
201
|
context "when the given transformer is callable" do
|
202
|
-
let(:callable) { lambda { |
|
202
|
+
let(:callable) { lambda { |_proto| nil } }
|
203
203
|
|
204
|
-
before { allow(User).to receive(:_protobuf_attribute_transformers).and_return(
|
204
|
+
before { allow(User).to receive(:_protobuf_attribute_transformers).and_return({}) }
|
205
205
|
|
206
206
|
it "adds the given converter to the list of protobuf field transformers" do
|
207
207
|
User.attribute_from_proto :account_id, callable
|
@@ -1,39 +1,39 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ::Protobuf::ActiveRecord::Transformer do
|
4
4
|
let(:callable) { lambda { |proto| proto.name } }
|
5
|
-
let(:proto) { ::UserMessage.new(:name =>
|
5
|
+
let(:proto) { ::UserMessage.new(:name => "test", :nullify => ["name"]) }
|
6
6
|
let(:options) { {} }
|
7
7
|
|
8
8
|
subject { described_class.new(callable, options) }
|
9
9
|
|
10
|
-
describe
|
11
|
-
it
|
10
|
+
describe "#call" do
|
11
|
+
it "calls the callable" do
|
12
12
|
result = subject.call(proto)
|
13
|
-
expect(result).to eq(
|
13
|
+
expect(result).to eq("test")
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
describe
|
18
|
-
context
|
19
|
-
it
|
17
|
+
describe "#nullify?" do
|
18
|
+
context "no nullify_on set" do
|
19
|
+
it "returns false" do
|
20
20
|
expect(subject.nullify?(proto)).to eq(false)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
context
|
24
|
+
context "nullify_on name" do
|
25
25
|
let(:options) { { :nullify_on => :name } }
|
26
26
|
|
27
|
-
context
|
27
|
+
context "invalid message" do
|
28
28
|
let(:proto) { ::UserSearchMessage.new }
|
29
29
|
|
30
|
-
it
|
30
|
+
it "returns false" do
|
31
31
|
expect(subject.nullify?(proto)).to eq(false)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
context
|
36
|
-
it
|
35
|
+
context "valid message" do
|
36
|
+
it "returns true" do
|
37
37
|
expect(subject.nullify?(proto)).to eq(true)
|
38
38
|
end
|
39
39
|
end
|
data/spec/support/db.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require "support/db/setup"
|
data/spec/support/db/setup.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_record"
|
2
2
|
|
3
3
|
ActiveRecord::Base.establish_connection(
|
4
4
|
:adapter => "sqlite3",
|
@@ -14,7 +14,7 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
14
14
|
t.string :url
|
15
15
|
t.integer :user_id
|
16
16
|
|
17
|
-
t.timestamps null
|
17
|
+
t.timestamps :null => false
|
18
18
|
end
|
19
19
|
|
20
20
|
create_table :users do |t|
|
@@ -24,6 +24,6 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
24
24
|
t.string :email
|
25
25
|
t.integer :account_id
|
26
26
|
|
27
|
-
t.timestamps null
|
27
|
+
t.timestamps :null => false
|
28
28
|
end
|
29
29
|
end
|
@@ -1,16 +1,20 @@
|
|
1
|
+
syntax = "proto3";
|
2
|
+
|
1
3
|
message PhotoMessage {
|
2
|
-
|
3
|
-
|
4
|
+
string url = 1;
|
5
|
+
int64 user_guid = 2;
|
4
6
|
}
|
5
7
|
|
6
8
|
message UserMessage {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
string guid = 1;
|
10
|
+
string name = 2;
|
11
|
+
string email = 3;
|
12
|
+
string email_domain = 4 [deprecated = true];
|
13
|
+
string password = 5;
|
12
14
|
repeated string nullify = 6;
|
13
15
|
repeated PhotoMessage photos = 7;
|
16
|
+
int64 created_at = 8;
|
17
|
+
int64 updated_at = 9;
|
14
18
|
}
|
15
19
|
|
16
20
|
message UserSearchMessage {
|
data/spec/support/models.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "support/models/photo"
|
2
|
+
require "support/models/user"
|
data/spec/support/models/user.rb
CHANGED
@@ -16,7 +16,8 @@ class User < ActiveRecord::Base
|
|
16
16
|
attribute_from_proto :last_name, :extract_last_name
|
17
17
|
attribute_from_proto :password, lambda { |proto| proto.password! }
|
18
18
|
|
19
|
-
field_from_record :email_domain, lambda { |record| record.email.split(
|
19
|
+
field_from_record :email_domain, lambda { |record| record.email.split("@").last }
|
20
|
+
field_from_record :password, :password_transformer
|
20
21
|
|
21
22
|
def self.extract_first_name(proto)
|
22
23
|
if proto.field?(:name)
|
@@ -37,6 +38,11 @@ class User < ActiveRecord::Base
|
|
37
38
|
last_name
|
38
39
|
end
|
39
40
|
|
41
|
+
def self.password_transformer(user)
|
42
|
+
# Simple way to test field transformers that call methods
|
43
|
+
user.password
|
44
|
+
end
|
45
|
+
|
40
46
|
def token
|
41
47
|
"key"
|
42
48
|
end
|
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.6.
|
4
|
+
version: 3.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Hutchison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: mad_rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rake
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -202,6 +216,7 @@ extra_rdoc_files: []
|
|
202
216
|
files:
|
203
217
|
- ".gitignore"
|
204
218
|
- ".rspec"
|
219
|
+
- ".rubocop.yml"
|
205
220
|
- ".travis.yml"
|
206
221
|
- Gemfile
|
207
222
|
- LICENSE.txt
|
@@ -263,7 +278,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
263
278
|
- !ruby/object:Gem::Version
|
264
279
|
version: '0'
|
265
280
|
requirements: []
|
266
|
-
rubygems_version: 3.0.
|
281
|
+
rubygems_version: 3.0.2
|
267
282
|
signing_key:
|
268
283
|
specification_version: 4
|
269
284
|
summary: Google Protocol Buffers integration for Active Record
|