pbbuilder 0.16.2 → 0.18.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f61e783abb61817e05f29772b6614314646c0fda6f24a5f73f556ebc19d0f97
4
- data.tar.gz: 34cf6626e2f60aa50a7ee2e7278a0149557263d023dee6a758e4adf2d8e0d263
3
+ metadata.gz: 75cb2682f8933e0e8acb2b3bb6a525df5447dab8a65b2d8509f54a3c2b430c35
4
+ data.tar.gz: '0282cfeb404460224fd8cb2d32d134335b9d307d2edefc4af854368b9c8788e1'
5
5
  SHA512:
6
- metadata.gz: 15f60555cb89a70e0b28490db9bc00e4b9ca7ed34f179a5df0576d6a70ef737c9d7acc66e686b0b0216a003e043c967162d377087a443f3057470e4396889e4e
7
- data.tar.gz: fd6e5587bd3d8bafc4988f089901afe2848c577243b5d9b105e629b92c3f7cbc522fbe218f9be59ca29605af27c034c423f244c8df0208dd72d9b67bf4831143
6
+ metadata.gz: d429891ca19333b9e626ccd9bf63462fbe61eea672c8ac14f427aafdc392a2f12e36370e63f1a4522c384b4375e81433d63d804f447d508346744aedca448fbf
7
+ data.tar.gz: 1af6634160780c84f93a99d9b6b282e90500da24d654bfa36f1220b48260bec074412da69f83267a2df8f935e33218b332a27cf102765e6eff7b3db853ec686e
data/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file.
3
3
 
4
4
  This format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5
5
 
6
+ ## 0.17.0
7
+ ### Changed
8
+ - Instead of appending to repeated enum message, we're replacing it to avoid issues in case output will be rendered twice
9
+ - If one field was defined twice, only last definition will end up in output
10
+
11
+ ## Fixed
12
+ - Fixed CI by locking 3 version or lower of google-protobuf dependency.
13
+
6
14
  ## 0.16.2
7
15
  ### Added
8
16
  - Add support for partial as a first argument , e.g.`pb.friends "racers/racer", as: :racer, collection: @racers`
data/README.md CHANGED
@@ -4,6 +4,11 @@ PBBuilder generates [Protobuf](https://developers.google.com/protocol-buffers) M
4
4
 
5
5
  At least Rails 6.1 is required.
6
6
 
7
+ > [!WARNING]
8
+ > There currently is a regression in ActionView (the part of Rails which renders) that forces rendered objects into strings. This is only present
9
+ > in Rails 7.1, and is fixed in Rails. However, a 7.1 gem containing the fix hasn't been released yet. For the moment you should refrain
10
+ > from using pbbuilder and rails-twirp with Rails 7.1 and wait for the next version to be released.
11
+
7
12
  ## Compatibility with jBuilder
8
13
  We don't aim to have 100% compitability and coverage with jbuilder gem, but we closely follow jbuilder's API design to maintain familiarity.
9
14
 
data/lib/pbbuilder.rb CHANGED
@@ -75,25 +75,38 @@ class Pbbuilder
75
75
  if arg.respond_to?(:to_hash)
76
76
  # example syntax that should end up here:
77
77
  # pb.fields {"one" => "two"}
78
+
78
79
  arg.to_hash.each { |k, v| @message[name][k] = v }
79
80
  elsif arg.respond_to?(:to_ary) && !descriptor.type.eql?(:message)
80
81
  # pb.fields ["one", "two"]
81
- # Using concat so it behaves the same as _append_repeated
82
82
 
83
- @message[name].concat arg.to_ary
83
+ @message[name].replace arg.to_ary
84
84
  elsif arg.respond_to?(:to_ary) && descriptor.type.eql?(:message)
85
- # example syntax that should end up here:
86
- # pb.friends [Person.new(name: "Johnny Test"), Person.new(name: "Max Verstappen")]
87
-
88
- args.flatten.each {|obj| @message[name].push descriptor.subtype.msgclass.new(obj)}
85
+ # pb.friends [Person.new(name: "Johnny Test"), Person.new(name: "Max Verstappen")]
86
+ #
87
+ # Accepts both objects that can be to_hash-translated into keyword arguments
88
+ # for creating a nested proto message object and actual proto message objects
89
+ # which can be assigned "as is". With "as-is" assignment the proto message can be stored
90
+ # in memory and reused
91
+ nested_messages = arg.map do |arg_member_message_or_hash|
92
+ # If the arg passed already is a proto message and is the same as the
93
+ # field expects - just use it as-is
94
+ if arg_member_message_or_hash.is_a?(descriptor.subtype.msgclass)
95
+ arg_member_message_or_hash
96
+ else
97
+ descriptor.subtype.msgclass.new(arg_member_message_or_hash)
98
+ end
99
+ end
100
+ @message[name].replace(nested_messages)
89
101
  else
90
102
  # example syntax that should end up here:
91
103
  # pb.fields "one"
92
- @message[name].push arg
104
+ @message[name].replace [arg]
93
105
  end
94
106
  else
95
107
  # example syntax that should end up here:
96
108
  # pb.field "value"
109
+
97
110
  @message[name] = arg
98
111
  end
99
112
  else
@@ -220,4 +233,4 @@ class Pbbuilder
220
233
  message_class = message_descriptor.msgclass
221
234
  message_class.new
222
235
  end
223
- end
236
+ end
data/pbbuilder.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "pbbuilder"
5
- spec.version = "0.16.2"
5
+ spec.version = "0.18.0"
6
6
  spec.authors = ["Bouke van der Bijl"]
7
7
  spec.email = ["bouke@cheddar.me"]
8
8
  spec.homepage = "https://github.com/cheddar-me/pbbuilder"
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
14
14
  spec.files = `git ls-files`.split("\n")
15
15
  spec.test_files = `git ls-files -- test/*`.split("\n")
16
16
 
17
- spec.add_dependency "google-protobuf"
17
+ spec.add_dependency "google-protobuf", "~> 3.25"
18
18
  spec.add_dependency "activesupport"
19
19
  spec.add_development_dependency 'm'
20
20
  spec.add_development_dependency "pry"
@@ -25,11 +25,55 @@ class PbbuilderTest < ActiveSupport::TestCase
25
25
 
26
26
  assert_equal "Hello world", person.name
27
27
  assert_equal "Friend #1", person.friends.first.name
28
- assert_equal ["ok", "that's", "cool"], person.field_mask.paths
28
+ assert_equal ["cool"], person.field_mask.paths
29
29
  assert_equal "Manuelo", person.best_friend.name
30
30
  assert_equal "Eggs", person.favourite_foods["Breakfast"]
31
31
  end
32
32
 
33
+ test "allows assignment of prefab nested proto messages" do
34
+ max_proto = API::Person.new(name: "Max Verstappen")
35
+ james_proto = API::Person.new(name: "James Hunt")
36
+ friend_protos = [max_proto, james_proto]
37
+
38
+ person = Pbbuilder.new(API::Person.new) do |pb|
39
+ pb.name "Niki Lauda"
40
+ pb.friends friend_protos
41
+ pb.best_friend james_proto
42
+ end.target!
43
+
44
+ assert_equal "Niki Lauda", person.name
45
+ assert_equal "Max Verstappen", person.friends[0].name
46
+ assert_equal "James Hunt", person.friends[1].name
47
+ assert_equal "James Hunt", person.best_friend.name
48
+ end
49
+
50
+ test "replaces the repeated field's value with the last one set" do
51
+ person = Pbbuilder.new(API::Person.new) do |pb|
52
+ pb.field_mask do
53
+ pb.paths ["ok", "that's"]
54
+ end
55
+ end.target!
56
+
57
+ p = Pbbuilder.new(person) do |pb|
58
+ pb.field_mask do
59
+ pb.paths ["ok", "that's"]
60
+ end
61
+ end.target!
62
+
63
+ assert_equal(["ok", "that's"], p.field_mask.paths)
64
+ end
65
+
66
+ test "sets the last value of the repeated field to be the only value" do
67
+ person = Pbbuilder.new(API::Person.new) do |pb|
68
+ pb.field_mask do
69
+ pb.paths ["ok", "that's"]
70
+ pb.paths ["cool"]
71
+ end
72
+ end.target!
73
+
74
+ assert_equal ["cool"], person.field_mask.paths
75
+ end
76
+
33
77
  test "it can extract fields in a nice way" do
34
78
  klass = Struct.new(:name)
35
79
  friends = [klass.new("Friend 1"), klass.new("Friend 2")]
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pbbuilder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.2
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bouke van der Bijl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-18 00:00:00.000000000 Z
11
+ date: 2024-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '3.25'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '3.25'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -123,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  requirements: []
126
- rubygems_version: 3.5.3
126
+ rubygems_version: 3.3.7
127
127
  signing_key:
128
128
  specification_version: 4
129
129
  summary: Generate Protobuf Messages with a simple DSL similar to JBuilder