pbbuilder 0.16.0 → 0.16.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/lib/pbbuilder/collection_renderer.rb +5 -1
- data/lib/pbbuilder/template.rb +11 -2
- data/lib/pbbuilder.rb +7 -0
- data/pbbuilder.gemspec +1 -1
- data/test/pbbuilder_template_test.rb +20 -3
- data/test/test_helper.rb +2 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4c9ff9f8ec71c8e3fee410430e9c29da1907e6e110ec6869531b52b8ec54ce5
|
4
|
+
data.tar.gz: 0f75e4c2fbdde5b6c33acc05dd62173b2b399d03c1030c7fd132c460d229b12b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0191dcf320aa97316c483230dda497cc1d83c20f1aac6caa5e4ce4a8883188a949a8217344f04445ab4375b1a4bf952c49eef115af357c87c8127f1c85db3ac7'
|
7
|
+
data.tar.gz: 287458b4fc6db49f90a0d76e4da273861b58bfd84d49edd86f966198a16cb694319cd47fca69200d5cad5767307fbbe83b2fa8c866519056313b3d435c5e917e
|
@@ -16,13 +16,17 @@ class Pbbuilder
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def build_rendered_collection(templates, _spacer)
|
19
|
-
|
19
|
+
pb_parent.set!(field, templates.map(&:body))
|
20
20
|
end
|
21
21
|
|
22
22
|
def pb
|
23
23
|
@options[:locals].fetch(:pb)
|
24
24
|
end
|
25
25
|
|
26
|
+
def pb_parent
|
27
|
+
@options[:locals].fetch(:pb_parent)
|
28
|
+
end
|
29
|
+
|
26
30
|
def field
|
27
31
|
@options[:locals].fetch(:field).to_s
|
28
32
|
end
|
data/lib/pbbuilder/template.rb
CHANGED
@@ -49,13 +49,22 @@ class PbbuilderTemplate < Pbbuilder
|
|
49
49
|
|
50
50
|
collection = options[:collection] || []
|
51
51
|
partial = options[:partial]
|
52
|
-
|
52
|
+
|
53
|
+
# The way recursive rendering works is that CollectionRenderer needs to be aware of node its currently rendering and parent node,
|
54
|
+
# these is no need to know entire "stack" of nodes. CollectionRenderer would traverse to bottom node render that first and then go up in stack.
|
55
|
+
|
56
|
+
# CollectionRenderer uses locals[:pb] to render the partial as a protobuf message,
|
57
|
+
# but also needs locals[:pb_parent] to apply rendered partial to top level protobuf message.
|
58
|
+
|
59
|
+
# This logic could be found in CollectionRenderer#build_rendered_collection method that we over wrote.
|
60
|
+
options[:locals].merge!(pb: ::PbbuilderTemplate.new(@context, new_message_for(field)))
|
61
|
+
options[:locals].merge!(pb_parent: self)
|
53
62
|
options[:locals].merge!(field: field)
|
54
63
|
|
55
64
|
if options.has_key?(:layout)
|
56
65
|
raise ::NotImplementedError, "The `:layout' option is not supported in collection rendering."
|
57
66
|
end
|
58
|
-
|
67
|
+
|
59
68
|
if options.has_key?(:spacer_template)
|
60
69
|
raise ::NotImplementedError, "The `:spacer_template' option is not supported in collection rendering."
|
61
70
|
end
|
data/lib/pbbuilder.rb
CHANGED
@@ -162,6 +162,13 @@ class Pbbuilder
|
|
162
162
|
@message
|
163
163
|
end
|
164
164
|
|
165
|
+
def new_message_for(field)
|
166
|
+
descriptor = _descriptor_for_field(field)
|
167
|
+
::Kernel.raise ::ArgumentError, "Unknown field #{field}" if descriptor.nil?
|
168
|
+
|
169
|
+
_new_message_from_descriptor(descriptor)
|
170
|
+
end
|
171
|
+
|
165
172
|
private
|
166
173
|
|
167
174
|
def _descriptor_for_field(field)
|
data/pbbuilder.gemspec
CHANGED
@@ -12,12 +12,20 @@ class PbbuilderTemplateTest < ActiveSupport::TestCase
|
|
12
12
|
pb.extract! racer, :name
|
13
13
|
pb.friends racer.friends, partial: "racers/racer", as: :racer
|
14
14
|
pb.best_friend partial: "racers/racer", racer: racer.best_friend if racer.best_friend.present?
|
15
|
+
pb.logo partial: "asset", asset: racer.logo if racer.logo.present?
|
16
|
+
PBBUILDER
|
17
|
+
|
18
|
+
ASSET_PARTIAL = <<-PBBUILDER
|
19
|
+
pb.url asset.url
|
20
|
+
pb.url_2x asset.url
|
21
|
+
pb.url_3x asset.url
|
15
22
|
PBBUILDER
|
16
23
|
|
17
24
|
PARTIALS = {
|
18
25
|
"_partial.pb.pbbuilder" => "pb.name name",
|
19
26
|
"_person.pb.pbbuilder" => PERSON_PARTIAL,
|
20
27
|
"racers/_racer.pb.pbbuilder" => RACER_PARTIAL,
|
28
|
+
"_asset.pb.pbbuilder" => ASSET_PARTIAL,
|
21
29
|
|
22
30
|
# Ensure we find only Pbbuilder partials from within Pbbuilder templates.
|
23
31
|
"_person.html.erb" => "Hello world!"
|
@@ -31,9 +39,19 @@ class PbbuilderTemplateTest < ActiveSupport::TestCase
|
|
31
39
|
end
|
32
40
|
|
33
41
|
test "render collections with partial as kwarg" do
|
34
|
-
|
42
|
+
template = <<-PBBUILDER
|
43
|
+
more_friends = [Racer.new(4, "Johnny Brave", [], nil, API::Asset.new(url: "https://google.com/test3.svg"))]
|
44
|
+
friends_of_racer = [Racer.new(3, "Chris Harris", more_friends, nil, API::Asset.new(url: "https://google.com/test2.svg"))]
|
45
|
+
racers = [Racer.new(1, "Johnny Test", friends_of_racer, nil, API::Asset.new(url: "https://google.com/test1.svg")), Racer.new(2, "Max Verstappen", [])]
|
46
|
+
pb.friends partial: "racers/racer", as: :racer, collection: racers
|
47
|
+
PBBUILDER
|
48
|
+
result = render(template)
|
35
49
|
|
36
50
|
assert_equal 2, result.friends.count
|
51
|
+
assert_nil result.logo
|
52
|
+
assert_equal "https://google.com/test1.svg", result.friends.first.logo.url
|
53
|
+
assert_equal "https://google.com/test2.svg", result.friends.first.friends.first.logo.url
|
54
|
+
assert_equal "https://google.com/test3.svg", result.friends.first.friends.first.friends.first.logo.url
|
37
55
|
end
|
38
56
|
|
39
57
|
test "CollectionRenderer: raises an error on a render with :layout option" do
|
@@ -52,14 +70,13 @@ class PbbuilderTemplateTest < ActiveSupport::TestCase
|
|
52
70
|
assert_equal "The `:spacer_template' option is not supported in collection rendering.", error.message
|
53
71
|
end
|
54
72
|
|
55
|
-
test "
|
73
|
+
test "render collections with partial as arg" do
|
56
74
|
skip("This will be addressed in future version of a gem")
|
57
75
|
result = render('pb.friends "racers/racer", as: :racer, collection: [Racer.new(1, "Johnny Test", []), Racer.new(2, "Max Verstappen", [])]')
|
58
76
|
|
59
77
|
assert_equal 2, result.friends.count
|
60
78
|
end
|
61
79
|
|
62
|
-
|
63
80
|
test "partial by name with top-level locals" do
|
64
81
|
result = render('pb.partial! "partial", name: "hello"')
|
65
82
|
assert_equal "hello", result.name
|
data/test/test_helper.rb
CHANGED
@@ -46,6 +46,7 @@ end
|
|
46
46
|
|
47
47
|
module API
|
48
48
|
Person = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("pbbuildertest.Person").msgclass
|
49
|
+
Asset = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("pbbuildertest.Asset").msgclass
|
49
50
|
end
|
50
51
|
|
51
52
|
class << Rails
|
@@ -54,7 +55,7 @@ class << Rails
|
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
|
-
class Racer < Struct.new(:id, :name, :friends, :best_friend)
|
58
|
+
class Racer < Struct.new(:id, :name, :friends, :best_friend, :logo)
|
58
59
|
extend ActiveModel::Naming
|
59
60
|
include ActiveModel::Conversion
|
60
61
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pbbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.16.
|
4
|
+
version: 0.16.1
|
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: 2023-
|
11
|
+
date: 2023-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-protobuf
|