pb-serializer 0.3.0 → 0.4.0
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/.github/workflows/ci.yml +4 -2
- data/.github/workflows/review.yml +5 -5
- data/CHANGELOG.md +6 -0
- data/lib/pb/serializable.rb +19 -3
- data/lib/pb/serializer.rb +2 -0
- data/lib/pb/serializer/attribute.rb +8 -5
- data/lib/pb/serializer/base.rb +7 -3
- data/lib/pb/serializer/normalized_mask.rb +57 -0
- data/lib/pb/serializer/version.rb +1 -1
- data/pb-serializer.gemspec +1 -1
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0edb07851fb2e4ee393ca69ffbcb56ae012cf5e0dc4d55874b3a9364b9dff3d0
|
4
|
+
data.tar.gz: efdfa935a65fd014dc5e757d92f6e3d4162e45c4352aa4047e360bb0ca1b86c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67a0ca4baa1bbf484a2c0b1b310a5299b0dd35864d87f9aef458f81d0c56e986be80ae2f4a15eb76be2c2f3befc74445674b0b9fc2b14a6b92feeb1438a4f954
|
7
|
+
data.tar.gz: 0043f9be4bf0a60631463179902b73493e7623a1f59b7d13f32e81f825767f6a0127b0ac4e2d7f3fc80f3b8b0f617c988bce778e3a28653b4e2bf98a8fdd508e
|
data/.github/workflows/ci.yml
CHANGED
@@ -9,8 +9,10 @@ jobs:
|
|
9
9
|
fail-fast: false
|
10
10
|
matrix:
|
11
11
|
os: [ ubuntu-latest, macos-latest ]
|
12
|
-
#
|
13
|
-
|
12
|
+
# TODO: Wait for supporting Ruby 3.0 in simplecov-cobertura.
|
13
|
+
# See https://github.com/dashingrocket/simplecov-cobertura/pull/16
|
14
|
+
# ruby: [ 2.5, 2.6, 2.7, 3.0 ]
|
15
|
+
ruby: [ 2.5, 2.6, 2.7 ]
|
14
16
|
runs-on: ${{ matrix.os }}
|
15
17
|
|
16
18
|
steps:
|
@@ -15,11 +15,9 @@ jobs:
|
|
15
15
|
sudo apt-get update
|
16
16
|
sudo apt-get install libsqlite3-dev
|
17
17
|
|
18
|
-
-
|
19
|
-
|
20
|
-
|
21
|
-
curl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s -- -b $HOME/bin
|
22
|
-
echo ::add-path::$HOME/bin
|
18
|
+
- uses: reviewdog/action-setup@v1
|
19
|
+
with:
|
20
|
+
reviewdog_version: latest
|
23
21
|
|
24
22
|
- run: gem install bundler -v 2.1.4
|
25
23
|
|
@@ -28,6 +26,8 @@ jobs:
|
|
28
26
|
- run: bundle install --jobs 4 --retry 3
|
29
27
|
|
30
28
|
- name: Run Rubocop with Reviewdog
|
29
|
+
env:
|
30
|
+
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
31
31
|
run: |
|
32
32
|
bundle exec rubocop --fail-level E \
|
33
33
|
| reviewdog -f=rubocop -reporter=github-pr-review
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
## Unreleased
|
2
2
|
|
3
|
+
## 0.4.0
|
4
|
+
|
5
|
+
- Make `#initialize` extensible used with `define_primary_loader` https://github.com/wantedly/pb-serializer/pull/31
|
6
|
+
- Supoprt `ignore` directive https://github.com/wantedly/pb-serializer/pull/36
|
7
|
+
- Support field mask https://github.com/wantedly/pb-serializer/pull/34
|
8
|
+
|
3
9
|
## 0.3.0
|
4
10
|
|
5
11
|
- Support `if` option https://github.com/wantedly/pb-serializer/pull/24
|
data/lib/pb/serializable.rb
CHANGED
@@ -6,8 +6,15 @@ module Pb
|
|
6
6
|
base.singleton_class.prepend Hook
|
7
7
|
end
|
8
8
|
|
9
|
+
# @param with [
|
10
|
+
# Google::Protobuf::FieldMask,
|
11
|
+
# Array<(Symbol, Hash)>,
|
12
|
+
# Hash{Symbol=>(Array,Symbol,Hash)},
|
13
|
+
# Pb::Serializer::NormalizedMask
|
14
|
+
# ]
|
9
15
|
def to_pb(with: nil)
|
10
|
-
|
16
|
+
with ||= ::Pb::Serializer.build_default_mask(self.class.message_class.descriptor)
|
17
|
+
with = ::Pb::Serializer::NormalizedMask.build(with)
|
11
18
|
|
12
19
|
oneof_set = []
|
13
20
|
|
@@ -26,12 +33,13 @@ module Pb
|
|
26
33
|
next
|
27
34
|
end
|
28
35
|
|
36
|
+
next unless with.key?(attr.name)
|
29
37
|
next unless attr.serializable?(self)
|
30
38
|
|
31
39
|
raise "#{self.name}.#{attr.name} is not defined" unless respond_to?(attr.name)
|
32
40
|
|
33
41
|
v = public_send(attr.name)
|
34
|
-
v = attr.convert_to_pb(v)
|
42
|
+
v = attr.convert_to_pb(v, with: with[attr.name])
|
35
43
|
|
36
44
|
if attr.oneof?
|
37
45
|
if !v.nil?
|
@@ -128,7 +136,14 @@ module Pb
|
|
128
136
|
end
|
129
137
|
end
|
130
138
|
|
131
|
-
# @param
|
139
|
+
# @param names [Array<Symbol>] Attribute names to be ignored
|
140
|
+
def ignore(*names)
|
141
|
+
names.each do |name|
|
142
|
+
attribute name, ignore: true
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# @param with [Array, Hash, Google::Protobuf::FieldMask, nil]
|
132
147
|
# @return [Array]
|
133
148
|
def bulk_load_and_serialize(with: nil, **args)
|
134
149
|
bulk_load(with: with, **args).map { |s| s.to_pb(with: with) }
|
@@ -136,6 +151,7 @@ module Pb
|
|
136
151
|
|
137
152
|
def bulk_load(with: nil, **args)
|
138
153
|
with ||= ::Pb::Serializer.build_default_mask(message_class.descriptor)
|
154
|
+
with = ::Pb::Serializer::NormalizedMask.build(with)
|
139
155
|
with = with.reject { |c| (__pb_serializer_attrs & (c.kind_of?(Hash) ? c.keys : [c])).empty? }
|
140
156
|
|
141
157
|
bulk_load_and_compute(with, **args)
|
data/lib/pb/serializer.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require "pb/serializer/version"
|
2
2
|
require "the_pb"
|
3
3
|
require "computed_model"
|
4
|
+
require "google/protobuf/field_mask_pb"
|
4
5
|
|
5
6
|
require "pb/serializable"
|
7
|
+
require "pb/serializer/normalized_mask"
|
6
8
|
require "pb/serializer/base"
|
7
9
|
require "pb/serializer/attribute"
|
8
10
|
require "pb/serializer/oneof"
|
@@ -8,7 +8,7 @@ module Pb
|
|
8
8
|
keyword_init: true,
|
9
9
|
)
|
10
10
|
|
11
|
-
ALLOWED_OPTIONS = Set[:allow_nil, :if, :serializer].freeze
|
11
|
+
ALLOWED_OPTIONS = Set[:allow_nil, :if, :serializer, :ignore].freeze
|
12
12
|
|
13
13
|
def initialize(options:, **)
|
14
14
|
super
|
@@ -36,6 +36,8 @@ module Pb
|
|
36
36
|
|
37
37
|
# @return [Boolean]
|
38
38
|
def serializable?(s)
|
39
|
+
return false if options[:ignore]
|
40
|
+
|
39
41
|
cond = options[:if]
|
40
42
|
|
41
43
|
return true unless cond
|
@@ -52,9 +54,10 @@ module Pb
|
|
52
54
|
end
|
53
55
|
|
54
56
|
# @param v [Object]
|
55
|
-
|
57
|
+
# @param with [Pb::Serializer::NormalizedMask]
|
58
|
+
def convert_to_pb(v, with: nil, should_repeat: repeated?)
|
56
59
|
return nil if v.nil?
|
57
|
-
return v.map { |i| convert_to_pb(i, should_repeat: false) } if should_repeat
|
60
|
+
return v.map { |i| convert_to_pb(i, should_repeat: false, with: with) } if should_repeat
|
58
61
|
|
59
62
|
case field_descriptor.type
|
60
63
|
when :message
|
@@ -74,8 +77,8 @@ module Pb
|
|
74
77
|
when "google.protobuf.BoolValue" then Pb.to_boolval(v)
|
75
78
|
when "google.protobuf.BytesValue" then Pb.to_bytesval(v)
|
76
79
|
else
|
77
|
-
return serializer_class.new(v).to_pb if serializer_class
|
78
|
-
return v.to_pb if v.kind_of?(::Pb::Serializable)
|
80
|
+
return serializer_class.new(v).to_pb(with: with) if serializer_class
|
81
|
+
return v.to_pb(with: with) if v.kind_of?(::Pb::Serializable)
|
79
82
|
|
80
83
|
raise "serializer was not found for #{field_descriptor.submsg_name}"
|
81
84
|
end
|
data/lib/pb/serializer/base.rb
CHANGED
@@ -15,10 +15,14 @@ module Pb
|
|
15
15
|
module Hook
|
16
16
|
def define_primary_loader(name, &block)
|
17
17
|
class_eval <<~RUBY
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
module PbSerializerDefinePrimaryLoaderPrependMethods
|
19
|
+
def initialize(*args)
|
20
|
+
super
|
21
|
+
@#{name} = object
|
22
|
+
end
|
21
23
|
end
|
24
|
+
|
25
|
+
prepend PbSerializerDefinePrimaryLoaderPrependMethods
|
22
26
|
RUBY
|
23
27
|
|
24
28
|
super
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Pb::Serializer
|
2
|
+
class NormalizedMask < ::Hash
|
3
|
+
class << self
|
4
|
+
# @param [Google::Protobuf::FieldMask, Symbol, Array<(Symbol,Hash)>, Hash{Symbol=>(Array,Symbol,Hash)}]
|
5
|
+
# @return [Hash{Symbol=>Hash}]
|
6
|
+
def build(input)
|
7
|
+
return input if input.kind_of? self
|
8
|
+
|
9
|
+
normalized = new
|
10
|
+
|
11
|
+
case input
|
12
|
+
when Google::Protobuf::FieldMask
|
13
|
+
normalized = normalize_mask_paths(input.paths)
|
14
|
+
when Array
|
15
|
+
input.each do |v|
|
16
|
+
deep_merge!(normalized, build(v))
|
17
|
+
end
|
18
|
+
when Hash
|
19
|
+
input.each do |k, v|
|
20
|
+
normalized[k] ||= new
|
21
|
+
deep_merge!(normalized[k], build(v))
|
22
|
+
end
|
23
|
+
when Symbol
|
24
|
+
normalized[input] ||= new
|
25
|
+
else
|
26
|
+
raise "not supported field mask type: #{input.class}"
|
27
|
+
end
|
28
|
+
|
29
|
+
normalized
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# @param [Array<String>]
|
35
|
+
# @return [Hash{Symbol=>Hash}]
|
36
|
+
def normalize_mask_paths(paths)
|
37
|
+
paths_by_key = {}
|
38
|
+
|
39
|
+
paths.each do |path|
|
40
|
+
key, rest = path.split('.', 2)
|
41
|
+
paths_by_key[key.to_sym] ||= []
|
42
|
+
paths_by_key[key.to_sym].push(rest) if rest && !rest.empty?
|
43
|
+
end
|
44
|
+
|
45
|
+
paths_by_key.keys.each_with_object(new) do |key, normalized|
|
46
|
+
normalized[key] = normalize_mask_paths(paths_by_key[key])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def deep_merge!(h1, h2)
|
51
|
+
h1.merge!(h2) do |_k, v1, v2|
|
52
|
+
deep_merge!(v1, v2)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/pb-serializer.gemspec
CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
|
|
29
29
|
rails_versions = [">= 5.2", "< 6.1"]
|
30
30
|
spec.add_runtime_dependency "google-protobuf", "~> 3.0"
|
31
31
|
spec.add_runtime_dependency "the_pb", "~> 0.0.1"
|
32
|
-
spec.add_runtime_dependency "computed_model", "~> 0.2.
|
32
|
+
spec.add_runtime_dependency "computed_model", "~> 0.2.2"
|
33
33
|
|
34
34
|
spec.add_development_dependency "activerecord", rails_versions
|
35
35
|
spec.add_development_dependency "bundler", "~> 2.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pb-serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- izumin5210
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-protobuf
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.2.
|
47
|
+
version: 0.2.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.2.
|
54
|
+
version: 0.2.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activerecord
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,6 +210,7 @@ files:
|
|
210
210
|
- lib/pb/serializer.rb
|
211
211
|
- lib/pb/serializer/attribute.rb
|
212
212
|
- lib/pb/serializer/base.rb
|
213
|
+
- lib/pb/serializer/normalized_mask.rb
|
213
214
|
- lib/pb/serializer/oneof.rb
|
214
215
|
- lib/pb/serializer/version.rb
|
215
216
|
- pb-serializer.gemspec
|
@@ -220,7 +221,7 @@ metadata:
|
|
220
221
|
homepage_uri: https://github.com/izumin5210/pb-serializer
|
221
222
|
source_code_uri: https://github.com/izumin5210/pb-serializer
|
222
223
|
changelog_uri: https://github.com/izumin5210/pb-serializer
|
223
|
-
post_install_message:
|
224
|
+
post_install_message:
|
224
225
|
rdoc_options: []
|
225
226
|
require_paths:
|
226
227
|
- lib
|
@@ -235,8 +236,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
236
|
- !ruby/object:Gem::Version
|
236
237
|
version: '0'
|
237
238
|
requirements: []
|
238
|
-
rubygems_version: 3.
|
239
|
-
signing_key:
|
239
|
+
rubygems_version: 3.2.3
|
240
|
+
signing_key:
|
240
241
|
specification_version: 4
|
241
242
|
summary: Serialize objects into Protocol Buffers messages
|
242
243
|
test_files: []
|