pbbuilder 0.2.0 → 0.6.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: 91b9708fb9269602e7f35f2a36e2491c1598e9d7968608912e58fb285d6c2c8a
4
- data.tar.gz: '089f9118be245c4a979bb10da5483b1b7f7d4136a8db8771a903581c226c1918'
3
+ metadata.gz: d3f417c956ceb3a2123489021f4cc401b7bf56399355fb6bb0d4ebaa437d1cb2
4
+ data.tar.gz: '0408c3174481e7aa7e22f129829a973f822a7245d57c3e93bad2ef564d3ee05f'
5
5
  SHA512:
6
- metadata.gz: a235c7d38a1f38a98668bc2ceb68fe3d6b468196fa0d5e5cf668b9dfafa199ec875b3c769370a6b1a1db9b1c3e24b22f6ca247105d87bdf5b4358c33d5404e91
7
- data.tar.gz: 747cf5e267268b2d05e64e297b41e0d181a0af6a01885521a734fd20845513914b4ba92d7a02fbd669dd2f8463cbb15eb5c6804978ce4d062d299fd1a2839957
6
+ metadata.gz: e7476c24846d78dd0dc011372998bb54301a673510ccc8cffe540714db1a991ba6b36c14ec0eb45572aef1880e9cb638870be38a7a510c4edb501eb0da670278
7
+ data.tar.gz: 3027ae2509d083bd9da6a02bf9732c43038534992790017a3bdb00ba1bb80179d650d1a12d6f136af036854a5944125cad64d7b17268b084609f3642e8f7dbfc
@@ -0,0 +1,22 @@
1
+ name: ruby
2
+ on: push
3
+
4
+ jobs:
5
+ test:
6
+ runs-on: ubuntu-latest
7
+ strategy:
8
+ matrix:
9
+ ruby: ["2.7", "3.0.1"]
10
+ name: tests for ruby-${{ matrix.ruby }}
11
+ steps:
12
+ - name: Checkout code
13
+ uses: actions/checkout@v2
14
+
15
+ - name: Setup Ruby
16
+ uses: ruby/setup-ruby@v1
17
+ with:
18
+ bundler-cache: true
19
+ ruby-version: ${{ matrix.ruby }}
20
+
21
+ - name: Run tests
22
+ run: bin/test
data/.gitignore CHANGED
@@ -11,3 +11,4 @@
11
11
  .byebug_history
12
12
  Gemfile.lock
13
13
  *.gem
14
+ /.idea
data/README.md CHANGED
@@ -22,7 +22,8 @@ $ gem install pbbuilder
22
22
  ```
23
23
 
24
24
  ## Contributing
25
- Contribution directions go here.
25
+
26
+ When debugging, make sure you're prepending `::Kernel` to any calls such as `puts` as otherwise the code will think you're trying to add another attribute onto the protobuf.
26
27
 
27
28
  ## License
28
29
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/lib/pbbuilder.rb CHANGED
@@ -44,7 +44,7 @@ class Pbbuilder < BasicObject
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,29 @@ class Pbbuilder < BasicObject
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_hash)
62
+ # pb.fields {"one" => "two"}
63
+ arg.to_hash.each do |k, v|
64
+ @message[name][k] = v
65
+ end
66
+ elsif arg.respond_to?(:to_ary)
67
+ # pb.fields ["one", "two"]
68
+ # Using concat so it behaves the same as _append_repeated
69
+ @message[name].concat arg.to_ary
70
+ else
71
+ # pb.fields "one"
72
+ @message[name].push arg
73
+ end
74
+ else
75
+ # pb.field "value"
76
+ @message[name] = arg
77
+ end
60
78
  else
61
79
  # pb.field @value, :id, :name, :url
62
80
  element = args.shift
@@ -68,7 +86,9 @@ class Pbbuilder < BasicObject
68
86
  extract!(item, *args)
69
87
  end
70
88
  else
71
- extract!(element, *args)
89
+ set!(name) do
90
+ extract!(element, *args)
91
+ end
72
92
  end
73
93
  end
74
94
  end
@@ -115,4 +135,5 @@ class Pbbuilder < BasicObject
115
135
  end
116
136
  end
117
137
 
138
+ require "pbbuilder/protobuf_extension"
118
139
  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.2.0"
3
+ spec.version = "0.6.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"
@@ -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,25 @@ 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
17
+ pb.favourite_foods({
18
+ "Breakfast" => "Eggs",
19
+ "Lunch" => "Shawarma",
20
+ "Dinner" => "Pizza"
21
+ })
11
22
  end.target!
12
- assert_equal person.name, "Hello world"
13
- assert_equal person.friends.first.name, "Friend #1"
23
+
24
+ assert_equal "Hello world", person.name
25
+ assert_equal "Friend #1", person.friends.first.name
26
+ assert_equal ["ok", "that's", "cool"], person.field_mask.paths
27
+ assert_equal "Manuelo", person.best_friend.name
28
+ assert_equal "Eggs", person.favourite_foods["Breakfast"]
14
29
  end
15
30
 
16
31
  test "it can extract fields in a nice way" do
@@ -19,11 +34,13 @@ class PbbuilderTest < ActiveSupport::TestCase
19
34
  person = Pbbuilder.new(API::Person.new) do |pb|
20
35
  pb.name "Hello world"
21
36
  pb.friends friends, :name
37
+ pb.best_friend friends[0], :name
22
38
  end.target!
23
39
 
24
40
  assert_equal person.name, "Hello world"
25
41
  assert_equal person.friends.size, 2
26
42
  assert_equal person.friends.first.name, "Friend 1"
27
43
  assert_equal person.friends.last.name, "Friend 2"
44
+ assert_equal person.best_friend.name, "Friend 1"
28
45
  end
29
46
  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,22 @@ 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"
22
+ map :favourite_foods, :string, :string, 6
17
23
  end
18
24
  end
19
25
  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.2.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bouke van der Bijl
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-31 00:00:00.000000000 Z
11
+ date: 2021-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -24,13 +24,14 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.15.5
27
- description:
27
+ description:
28
28
  email:
29
29
  - bouke@cheddar.me
30
30
  executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
+ - ".github/workflows/test.yml"
34
35
  - ".gitignore"
35
36
  - Gemfile
36
37
  - MIT-LICENSE
@@ -39,16 +40,18 @@ files:
39
40
  - bin/test
40
41
  - lib/pbbuilder.rb
41
42
  - lib/pbbuilder/handler.rb
43
+ - lib/pbbuilder/protobuf_extension.rb
42
44
  - lib/pbbuilder/railtie.rb
43
45
  - lib/tasks/pbbuilder_tasks.rake
44
46
  - pbbuilder.gemspec
45
47
  - test/pbbuilder_test.rb
48
+ - test/protobuf_extension_test.rb
46
49
  - test/test_helper.rb
47
50
  homepage: https://github.com/cheddar-me/pbbuilder
48
51
  licenses:
49
52
  - MIT
50
53
  metadata: {}
51
- post_install_message:
54
+ post_install_message:
52
55
  rdoc_options: []
53
56
  require_paths:
54
57
  - lib
@@ -63,10 +66,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
66
  - !ruby/object:Gem::Version
64
67
  version: '0'
65
68
  requirements: []
66
- rubygems_version: 3.2.3
67
- signing_key:
69
+ rubygems_version: 3.1.4
70
+ signing_key:
68
71
  specification_version: 4
69
72
  summary: Generate Protobuf messages via a Builder-style DSL
70
73
  test_files:
71
74
  - test/pbbuilder_test.rb
75
+ - test/protobuf_extension_test.rb
72
76
  - test/test_helper.rb