pbbuilder 0.1.0 → 0.5.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: 95c1a8225cbe27f9523fe58f6e0a706108ae12839d1b091b6a2a70d02d5363cc
4
- data.tar.gz: b133c221d7f27e76626632c488309c4c1d8c929e1725d34298847c42ad5f7350
3
+ metadata.gz: 1ef756425a57d8ea7b70338e5d15f4de645a0fe43c6429a7bc83e601c3ae7730
4
+ data.tar.gz: 5c7579092048ee2b38f4aca3fa02c0c1490bb2f87a0ae58e9120672ca78b2de7
5
5
  SHA512:
6
- metadata.gz: 033030a337a7b3a7e334719d564dfe098c7e1f7b54e8cea18ace761d51adb091c7fbe0b6b42d527ebc1e3b622e8d3332f4400a1444e263b55c2a95cf9a8e92fd
7
- data.tar.gz: 76f971940ae26fcd1360552cec8e5e9bb3160f21a39e36184d2bc700524f480c1b5261781dd760be5d33d702c4e2a95739e5f32d890d348f6f698dc0ee1a315f
6
+ metadata.gz: 6f963451d5430510700378384d0a996ad6eb15e311dc3669d8246122c2db7e65a0bb9b50b63855b18da1cf5f1484a57f85ad3eda95b3647f09438d04fc78d0e9
7
+ data.tar.gz: 52d88436c2f78dbe307f2ce87935a03c293a6ee68d2c471c993ef753166f7450380bf600f759b2d4d5467c5167a50d93dcb63d145085f8bf50acbcdc43531bd1
data/.gitignore CHANGED
@@ -10,3 +10,5 @@
10
10
  /test/dummy/tmp/
11
11
  .byebug_history
12
12
  Gemfile.lock
13
+ *.gem
14
+ /.idea
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in pbbuilder.gemspec.
4
4
  gemspec
5
+
6
+ gem "rake"
7
+ gem "rails"
data/lib/pbbuilder.rb CHANGED
@@ -21,7 +21,7 @@
21
21
  # It basically works exactly like jbuilder. The main difference is that it can use introspection to figure out what kind
22
22
  # of protobuf message it needs to create.
23
23
 
24
- class Pbbuilder
24
+ class Pbbuilder < BasicObject
25
25
  def initialize(message)
26
26
  @message = message
27
27
 
@@ -44,7 +44,7 @@ class Pbbuilder
44
44
  raise ::ArgumentError, "can't pass block to non-message field" unless descriptor.type == :message
45
45
 
46
46
  if descriptor.label == :repeated
47
- # pb.field @array { |element| pb.name = element.name }
47
+ # pb.field @array { |element| pb.name element.name }
48
48
  raise ::ArgumentError, "wrong number of arguments (expected 1)" unless args.length == 1
49
49
  collection = args.first
50
50
  _append_repeated(name, descriptor, collection, &block)
@@ -52,11 +52,24 @@ class Pbbuilder
52
52
  end
53
53
 
54
54
  raise ::ArgumentError, "wrong number of arguments (expected 0)" unless args.empty?
55
- # pb.field { pb.name = "hello" }
55
+ # pb.field { pb.name "hello" }
56
56
  message = (@message[name] ||= _new_message_from_descriptor(descriptor))
57
57
  _scope(message, &block)
58
58
  elsif args.length == 1
59
- @message[name] = args.first
59
+ arg = args.first
60
+ if descriptor.label == :repeated
61
+ if arg.respond_to?(:to_ary)
62
+ # pb.fields ["one", "two"]
63
+ # Using concat so it behaves the same as _append_repeated
64
+ @message[name].concat arg.to_ary
65
+ else
66
+ # pb.fields "one"
67
+ @message[name].push arg
68
+ end
69
+ else
70
+ # pb.field "value"
71
+ @message[name] = arg
72
+ end
60
73
  else
61
74
  # pb.field @value, :id, :name, :url
62
75
  element = args.shift
@@ -68,7 +81,9 @@ class Pbbuilder
68
81
  extract!(item, *args)
69
82
  end
70
83
  else
71
- extract!(element, *args)
84
+ set!(name) do
85
+ extract!(element, *args)
86
+ end
72
87
  end
73
88
  end
74
89
  end
@@ -115,4 +130,5 @@ class Pbbuilder
115
130
  end
116
131
  end
117
132
 
133
+ require "pbbuilder/protobuf_extension"
118
134
  require "pbbuilder/railtie" if defined?(Rails)
@@ -6,7 +6,7 @@ class PbbuilderHandler
6
6
  def self.call(template, source = nil)
7
7
  source ||= template.source
8
8
  # We need to keep `source` on the first line, so line numbers are correct if there's an error
9
- %{pb=Pbbuilder.new(response_class.new); #{source}
9
+ %{pb=Pbbuilder.new(@_response_class.new); #{source}
10
10
  pb.target!}
11
11
  end
12
12
  end
@@ -0,0 +1,7 @@
1
+ require "google/protobuf/message_exts"
2
+
3
+ module Google::Protobuf::MessageExts::ClassMethods
4
+ def build(*args, &block)
5
+ Pbbuilder.new(new(*args), &block).target!
6
+ end
7
+ end
data/pbbuilder.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "pbbuilder"
3
- spec.version = "0.1.0"
3
+ spec.version = "0.5.0"
4
4
  spec.authors = ["Bouke van der Bijl"]
5
5
  spec.email = ["bouke@cheddar.me"]
6
6
  spec.homepage = "https://github.com/cheddar-me/pbbuilder"
@@ -10,6 +10,5 @@ Gem::Specification.new do |spec|
10
10
  spec.files = `git ls-files`.split("\n")
11
11
  spec.test_files = `git ls-files -- test/*`.split("\n")
12
12
 
13
- spec.add_dependency "rails", "~> 6.1.3"
14
13
  spec.add_dependency "google-protobuf", "~> 3.15.5"
15
14
  end
@@ -1,5 +1,4 @@
1
1
  require "test_helper"
2
- require "pbbuilder"
3
2
 
4
3
  class PbbuilderTest < ActiveSupport::TestCase
5
4
  test "it makes it possible to create a person" do
@@ -8,9 +7,18 @@ class PbbuilderTest < ActiveSupport::TestCase
8
7
  pb.friends 1..3 do |number|
9
8
  pb.name "Friend ##{number}"
10
9
  end
10
+ pb.best_friend do
11
+ pb.name "Manuelo"
12
+ end
13
+ pb.field_mask do
14
+ pb.paths ["ok", "that's"]
15
+ pb.paths "cool"
16
+ end
11
17
  end.target!
12
- assert_equal person.name, "Hello world"
13
- assert_equal person.friends.first.name, "Friend #1"
18
+ assert_equal "Hello world", person.name
19
+ assert_equal "Friend #1", person.friends.first.name
20
+ assert_equal ["ok", "that's", "cool"], person.field_mask.paths
21
+ assert_equal "Manuelo", person.best_friend.name
14
22
  end
15
23
 
16
24
  test "it can extract fields in a nice way" do
@@ -19,11 +27,13 @@ class PbbuilderTest < ActiveSupport::TestCase
19
27
  person = Pbbuilder.new(API::Person.new) do |pb|
20
28
  pb.name "Hello world"
21
29
  pb.friends friends, :name
30
+ pb.best_friend friends[0], :name
22
31
  end.target!
23
32
 
24
33
  assert_equal person.name, "Hello world"
25
34
  assert_equal person.friends.size, 2
26
35
  assert_equal person.friends.first.name, "Friend 1"
27
36
  assert_equal person.friends.last.name, "Friend 2"
37
+ assert_equal person.best_friend.name, "Friend 1"
28
38
  end
29
39
  end
@@ -0,0 +1,18 @@
1
+ require "test_helper"
2
+
3
+ class ProtobufExtensionTest < ActiveSupport::TestCase
4
+ test ".build" do
5
+ person = API::Person.build(name: "Hello world!") do |pb|
6
+ pb.best_friend do
7
+ pb.name "Johnny"
8
+ end
9
+ end
10
+ assert_equal "Hello world!", person.name
11
+ assert_equal "Johnny", person.best_friend.name
12
+ end
13
+
14
+ test ".build without block" do
15
+ person = API::Person.build
16
+ assert_equal "", person.name
17
+ end
18
+ end
data/test/test_helper.rb CHANGED
@@ -4,16 +4,21 @@ ENV["RAILS_ENV"] = "test"
4
4
  require "rails"
5
5
  require "rails/test_help"
6
6
  require "rails/test_unit/reporter"
7
+ require "pbbuilder"
7
8
 
8
9
  Rails::TestUnitReporter.executable = "bin/test"
9
10
 
10
11
  require "google/protobuf"
12
+ require "google/protobuf/field_mask_pb"
11
13
 
12
14
  Google::Protobuf::DescriptorPool.generated_pool.build do
13
15
  add_file("pbbuilder.proto", syntax: :proto3) do
14
16
  add_message "pbbuildertest.Person" do
15
17
  optional :name, :string, 1
16
18
  repeated :friends, :message, 2, "pbbuildertest.Person"
19
+ optional :best_friend, :message, 3, "pbbuildertest.Person"
20
+ repeated :nicknames, :string, 4
21
+ optional :field_mask, :message, 5, "google.protobuf.FieldMask"
17
22
  end
18
23
  end
19
24
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pbbuilder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.5.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: 2021-03-31 00:00:00.000000000 Z
11
+ date: 2021-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rails
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 6.1.3
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 6.1.3
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: google-protobuf
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -53,10 +39,12 @@ files:
53
39
  - bin/test
54
40
  - lib/pbbuilder.rb
55
41
  - lib/pbbuilder/handler.rb
42
+ - lib/pbbuilder/protobuf_extension.rb
56
43
  - lib/pbbuilder/railtie.rb
57
44
  - lib/tasks/pbbuilder_tasks.rake
58
45
  - pbbuilder.gemspec
59
46
  - test/pbbuilder_test.rb
47
+ - test/protobuf_extension_test.rb
60
48
  - test/test_helper.rb
61
49
  homepage: https://github.com/cheddar-me/pbbuilder
62
50
  licenses:
@@ -83,4 +71,5 @@ specification_version: 4
83
71
  summary: Generate Protobuf messages via a Builder-style DSL
84
72
  test_files:
85
73
  - test/pbbuilder_test.rb
74
+ - test/protobuf_extension_test.rb
86
75
  - test/test_helper.rb