google-protobuf 3.14.0 → 3.21.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.

Potentially problematic release.


This version of google-protobuf might be problematic. Click here for more details.

Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/ext/google/protobuf_c/convert.c +361 -0
  3. data/ext/google/protobuf_c/convert.h +75 -0
  4. data/ext/google/protobuf_c/defs.c +576 -1662
  5. data/ext/google/protobuf_c/defs.h +107 -0
  6. data/ext/google/protobuf_c/extconf.rb +13 -6
  7. data/ext/google/protobuf_c/map.c +329 -463
  8. data/ext/google/protobuf_c/map.h +66 -0
  9. data/ext/google/protobuf_c/message.c +1010 -467
  10. data/ext/google/protobuf_c/message.h +104 -0
  11. data/ext/google/protobuf_c/protobuf.c +411 -67
  12. data/ext/google/protobuf_c/protobuf.h +49 -596
  13. data/ext/google/protobuf_c/repeated_field.c +299 -328
  14. data/ext/google/protobuf_c/repeated_field.h +63 -0
  15. data/ext/google/protobuf_c/ruby-upb.c +11115 -0
  16. data/ext/google/protobuf_c/ruby-upb.h +5612 -0
  17. data/ext/google/protobuf_c/third_party/utf8_range/LICENSE +21 -0
  18. data/ext/google/protobuf_c/third_party/utf8_range/naive.c +92 -0
  19. data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +157 -0
  20. data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +170 -0
  21. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +9 -0
  22. data/ext/google/protobuf_c/wrap_memcpy.c +4 -3
  23. data/lib/google/protobuf/api_pb.rb +1 -0
  24. data/lib/google/protobuf/descriptor_dsl.rb +465 -0
  25. data/lib/google/protobuf/descriptor_pb.rb +269 -0
  26. data/lib/google/protobuf/message_exts.rb +2 -2
  27. data/lib/google/protobuf/repeated_field.rb +15 -2
  28. data/lib/google/protobuf/type_pb.rb +1 -0
  29. data/lib/google/protobuf/well_known_types.rb +12 -2
  30. data/lib/google/protobuf.rb +5 -73
  31. data/tests/basic.rb +209 -13
  32. data/tests/stress.rb +1 -1
  33. metadata +23 -32
  34. data/ext/google/protobuf_c/encode_decode.c +0 -1795
  35. data/ext/google/protobuf_c/storage.c +0 -1198
  36. data/ext/google/protobuf_c/upb.c +0 -13817
  37. data/ext/google/protobuf_c/upb.h +0 -6777
data/tests/basic.rb CHANGED
@@ -31,6 +31,85 @@ module BasicTest
31
31
  end
32
32
  include CommonTests
33
33
 
34
+ def test_issue_8311_crash
35
+ Google::Protobuf::DescriptorPool.generated_pool.build do
36
+ add_file("inner.proto", :syntax => :proto3) do
37
+ add_message "Inner" do
38
+ # Removing either of these fixes the segfault.
39
+ optional :foo, :string, 1
40
+ optional :bar, :string, 2
41
+ end
42
+ end
43
+ end
44
+
45
+ Google::Protobuf::DescriptorPool.generated_pool.build do
46
+ add_file("outer.proto", :syntax => :proto3) do
47
+ add_message "Outer" do
48
+ repeated :inners, :message, 1, "Inner"
49
+ end
50
+ end
51
+ end
52
+
53
+ outer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("Outer").msgclass
54
+
55
+ outer.new(
56
+ inners: []
57
+ )['inners'].to_s
58
+
59
+ assert_raise Google::Protobuf::TypeError do
60
+ outer.new(
61
+ inners: [nil]
62
+ ).to_s
63
+ end
64
+ end
65
+
66
+ def test_issue_8559_crash
67
+ msg = TestMessage.new
68
+ msg.repeated_int32 = ::Google::Protobuf::RepeatedField.new(:int32, [1, 2, 3])
69
+
70
+ # https://github.com/jruby/jruby/issues/6818 was fixed in JRuby 9.3.0.0
71
+ if cruby_or_jruby_9_3_or_higher?
72
+ GC.start(full_mark: true, immediate_sweep: true)
73
+ end
74
+ TestMessage.encode(msg)
75
+ end
76
+
77
+ def test_issue_9440
78
+ msg = HelloRequest.new
79
+ msg.id = 8
80
+ assert_equal 8, msg.id
81
+ msg.version = '1'
82
+ assert_equal 8, msg.id
83
+ end
84
+
85
+ def test_issue_9507
86
+ pool = Google::Protobuf::DescriptorPool.new
87
+ pool.build do
88
+ add_message "NpeMessage" do
89
+ optional :type, :enum, 1, "TestEnum"
90
+ optional :other, :string, 2
91
+ end
92
+ add_enum "TestEnum" do
93
+ value :Something, 0
94
+ end
95
+ end
96
+
97
+ msgclass = pool.lookup("NpeMessage").msgclass
98
+
99
+ m = msgclass.new(
100
+ other: "foo" # must be set, but can be blank
101
+ )
102
+
103
+ begin
104
+ encoded = msgclass.encode(m)
105
+ rescue java.lang.NullPointerException
106
+ flunk "NPE rescued"
107
+ end
108
+ decoded = msgclass.decode(encoded)
109
+ decoded.inspect
110
+ decoded.to_proto
111
+ end
112
+
34
113
  def test_has_field
35
114
  m = TestSingularFields.new
36
115
  assert !m.has_singular_msg?
@@ -97,7 +176,7 @@ module BasicTest
97
176
  m = TestSingularFields.new
98
177
 
99
178
  m.singular_int32 = -42
100
- assert_equal -42, m.singular_int32
179
+ assert_equal( -42, m.singular_int32 )
101
180
  m.clear_singular_int32
102
181
  assert_equal 0, m.singular_int32
103
182
 
@@ -129,6 +208,17 @@ module BasicTest
129
208
  assert_equal nil, m.singular_msg
130
209
  end
131
210
 
211
+ def test_import_proto2
212
+ m = TestMessage.new
213
+ assert !m.has_optional_proto2_submessage?
214
+ m.optional_proto2_submessage = ::FooBar::Proto2::TestImportedMessage.new
215
+ assert m.has_optional_proto2_submessage?
216
+ assert TestMessage.descriptor.lookup('optional_proto2_submessage').has?(m)
217
+
218
+ m.clear_optional_proto2_submessage
219
+ assert !m.has_optional_proto2_submessage?
220
+ end
221
+
132
222
  def test_clear_repeated_fields
133
223
  m = TestMessage.new
134
224
 
@@ -216,7 +306,7 @@ module BasicTest
216
306
  m.map_string_int32 = {}
217
307
  end
218
308
 
219
- assert_raise TypeError do
309
+ assert_raise Google::Protobuf::TypeError do
220
310
  m = MapMessage.new(:map_string_int32 => { 1 => "I am not a number" })
221
311
  end
222
312
  end
@@ -241,8 +331,12 @@ module BasicTest
241
331
  :map_string_msg => {"a" => TestMessage2.new(:foo => 1),
242
332
  "b" => TestMessage2.new(:foo => 2)},
243
333
  :map_string_enum => {"a" => :A, "b" => :B})
244
- expected = "<BasicTest::MapMessage: map_string_int32: {\"b\"=>2, \"a\"=>1}, map_string_msg: {\"b\"=><BasicTest::TestMessage2: foo: 2>, \"a\"=><BasicTest::TestMessage2: foo: 1>}, map_string_enum: {\"b\"=>:B, \"a\"=>:A}>"
245
- assert_equal expected, m.inspect
334
+
335
+ # JRuby doesn't keep consistent ordering so check for either version
336
+ expected_a = "<BasicTest::MapMessage: map_string_int32: {\"b\"=>2, \"a\"=>1}, map_string_msg: {\"b\"=><BasicTest::TestMessage2: foo: 2>, \"a\"=><BasicTest::TestMessage2: foo: 1>}, map_string_enum: {\"b\"=>:B, \"a\"=>:A}>"
337
+ expected_b = "<BasicTest::MapMessage: map_string_int32: {\"a\"=>1, \"b\"=>2}, map_string_msg: {\"a\"=><BasicTest::TestMessage2: foo: 1>, \"b\"=><BasicTest::TestMessage2: foo: 2>}, map_string_enum: {\"a\"=>:A, \"b\"=>:B}>"
338
+ inspect_result = m.inspect
339
+ assert expected_a == inspect_result || expected_b == inspect_result, "Incorrect inspect result: #{inspect_result}"
246
340
  end
247
341
 
248
342
  def test_map_corruption
@@ -443,6 +537,8 @@ module BasicTest
443
537
  :optional_int32=>0,
444
538
  :optional_int64=>0,
445
539
  :optional_msg=>nil,
540
+ :optional_msg2=>nil,
541
+ :optional_proto2_submessage=>nil,
446
542
  :optional_string=>"foo",
447
543
  :optional_uint32=>0,
448
544
  :optional_uint64=>0,
@@ -475,14 +571,12 @@ module BasicTest
475
571
 
476
572
 
477
573
  def test_json_maps
478
- # TODO: Fix JSON in JRuby version.
479
- return if RUBY_PLATFORM == "java"
480
574
  m = MapMessage.new(:map_string_int32 => {"a" => 1})
481
575
  expected = {mapStringInt32: {a: 1}, mapStringMsg: {}, mapStringEnum: {}}
482
576
  expected_preserve = {map_string_int32: {a: 1}, map_string_msg: {}, map_string_enum: {}}
483
- assert_equal JSON.parse(MapMessage.encode_json(m), :symbolize_names => true), expected
577
+ assert_equal JSON.parse(MapMessage.encode_json(m, :emit_defaults=>true), :symbolize_names => true), expected
484
578
 
485
- json = MapMessage.encode_json(m, :preserve_proto_fieldnames => true)
579
+ json = MapMessage.encode_json(m, :preserve_proto_fieldnames => true, :emit_defaults=>true)
486
580
  assert_equal JSON.parse(json, :symbolize_names => true), expected_preserve
487
581
 
488
582
  m2 = MapMessage.decode_json(MapMessage.encode_json(m))
@@ -490,9 +584,7 @@ module BasicTest
490
584
  end
491
585
 
492
586
  def test_json_maps_emit_defaults_submsg
493
- # TODO: Fix JSON in JRuby version.
494
- return if RUBY_PLATFORM == "java"
495
- m = MapMessage.new(:map_string_msg => {"a" => TestMessage2.new})
587
+ m = MapMessage.new(:map_string_msg => {"a" => TestMessage2.new(foo: 0)})
496
588
  expected = {mapStringInt32: {}, mapStringMsg: {a: {foo: 0}}, mapStringEnum: {}}
497
589
 
498
590
  actual = MapMessage.encode_json(m, :emit_defaults => true)
@@ -500,9 +592,29 @@ module BasicTest
500
592
  assert_equal JSON.parse(actual, :symbolize_names => true), expected
501
593
  end
502
594
 
595
+ def test_json_emit_defaults_submsg
596
+ m = TestSingularFields.new(singular_msg: proto_module::TestMessage2.new)
597
+
598
+ expected = {
599
+ singularInt32: 0,
600
+ singularInt64: "0",
601
+ singularUint32: 0,
602
+ singularUint64: "0",
603
+ singularBool: false,
604
+ singularFloat: 0,
605
+ singularDouble: 0,
606
+ singularString: "",
607
+ singularBytes: "",
608
+ singularMsg: {},
609
+ singularEnum: "Default",
610
+ }
611
+
612
+ actual = proto_module::TestMessage.encode_json(m, :emit_defaults => true)
613
+
614
+ assert_equal expected, JSON.parse(actual, :symbolize_names => true)
615
+ end
616
+
503
617
  def test_respond_to
504
- # This test fails with JRuby 1.7.23, likely because of an old JRuby bug.
505
- return if RUBY_PLATFORM == "java"
506
618
  msg = MapMessage.new
507
619
  assert msg.respond_to?(:map_string_int32)
508
620
  assert !msg.respond_to?(:bacon)
@@ -539,5 +651,89 @@ module BasicTest
539
651
  assert_raise(FrozenErrorType) { m.map_string_int32.delete('a') }
540
652
  assert_raise(FrozenErrorType) { m.map_string_int32.clear }
541
653
  end
654
+
655
+ def test_map_length
656
+ m = proto_module::MapMessage.new
657
+ assert_equal 0, m.map_string_int32.length
658
+ assert_equal 0, m.map_string_msg.length
659
+ assert_equal 0, m.map_string_int32.size
660
+ assert_equal 0, m.map_string_msg.size
661
+
662
+ m.map_string_int32['a'] = 1
663
+ m.map_string_int32['b'] = 2
664
+ m.map_string_msg['a'] = proto_module::TestMessage2.new
665
+ assert_equal 2, m.map_string_int32.length
666
+ assert_equal 1, m.map_string_msg.length
667
+ assert_equal 2, m.map_string_int32.size
668
+ assert_equal 1, m.map_string_msg.size
669
+ end
670
+
671
+ def test_string_with_singleton_class_enabled
672
+ str = 'foobar'
673
+ # NOTE: Accessing a singleton class of an object changes its low level class representation
674
+ # as far as the C API's CLASS_OF() method concerned, exposing the issue
675
+ str.singleton_class
676
+ m = proto_module::TestMessage.new(
677
+ optional_string: str,
678
+ optional_bytes: str
679
+ )
680
+
681
+ assert_equal str, m.optional_string
682
+ assert_equal str, m.optional_bytes
683
+ end
684
+
685
+ def test_utf8
686
+ m = proto_module::TestMessage.new(
687
+ optional_string: "µpb",
688
+ )
689
+ m2 = proto_module::TestMessage.decode(proto_module::TestMessage.encode(m))
690
+ assert_equal m2, m
691
+ end
692
+
693
+ def test_map_fields_respond_to? # regression test for issue 9202
694
+ msg = proto_module::MapMessage.new
695
+ assert msg.respond_to?(:map_string_int32=)
696
+ msg.map_string_int32 = Google::Protobuf::Map.new(:string, :int32)
697
+ assert msg.respond_to?(:map_string_int32)
698
+ assert_equal( Google::Protobuf::Map.new(:string, :int32), msg.map_string_int32 )
699
+ assert msg.respond_to?(:clear_map_string_int32)
700
+ msg.clear_map_string_int32
701
+
702
+ assert !msg.respond_to?(:has_map_string_int32?)
703
+ assert_raise NoMethodError do
704
+ msg.has_map_string_int32?
705
+ end
706
+ assert !msg.respond_to?(:map_string_int32_as_value)
707
+ assert_raise NoMethodError do
708
+ msg.map_string_int32_as_value
709
+ end
710
+ assert !msg.respond_to?(:map_string_int32_as_value=)
711
+ assert_raise NoMethodError do
712
+ msg.map_string_int32_as_value = :boom
713
+ end
714
+ end
715
+ end
716
+
717
+ def test_oneof_fields_respond_to? # regression test for issue 9202
718
+ msg = proto_module::OneofMessage.new
719
+ # `has_` prefix + "?" suffix actions should only work for oneofs fields.
720
+ assert msg.has_my_oneof?
721
+ assert msg.respond_to? :has_my_oneof?
722
+ assert !msg.respond_to?( :has_a? )
723
+ assert_raise NoMethodError do
724
+ msg.has_a?
725
+ end
726
+ assert !msg.respond_to?( :has_b? )
727
+ assert_raise NoMethodError do
728
+ msg.has_b?
729
+ end
730
+ assert !msg.respond_to?( :has_c? )
731
+ assert_raise NoMethodError do
732
+ msg.has_c?
733
+ end
734
+ assert !msg.respond_to?( :has_d? )
735
+ assert_raise NoMethodError do
736
+ msg.has_d?
737
+ end
542
738
  end
543
739
  end
data/tests/stress.rb CHANGED
@@ -30,7 +30,7 @@ module StressTest
30
30
  100_000.times do
31
31
  mnew = TestMessage.decode(data)
32
32
  mnew = mnew.dup
33
- assert_equal mnew.inspect, m.inspect
33
+ assert_equal m.inspect, mnew.inspect
34
34
  assert TestMessage.encode(mnew) == data
35
35
  end
36
36
  end
metadata CHANGED
@@ -1,35 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-protobuf
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.14.0
4
+ version: 3.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Protobuf Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-13 00:00:00.000000000 Z
11
+ date: 2022-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler-dock
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 1.0.1
20
- - - "<"
17
+ - - '='
21
18
  - !ruby/object:Gem::Version
22
- version: '2.0'
19
+ version: 1.2.1
23
20
  type: :development
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 1.0.1
30
- - - "<"
24
+ - - '='
31
25
  - !ruby/object:Gem::Version
32
- version: '2.0'
26
+ version: 1.2.1
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: rake-compiler
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -64,20 +58,6 @@ dependencies:
64
58
  - - ">="
65
59
  - !ruby/object:Gem::Version
66
60
  version: 3.0.9
67
- - !ruby/object:Gem::Dependency
68
- name: rubygems-tasks
69
- requirement: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - "~>"
72
- - !ruby/object:Gem::Version
73
- version: 0.2.4
74
- type: :development
75
- prerelease: false
76
- version_requirements: !ruby/object:Gem::Requirement
77
- requirements:
78
- - - "~>"
79
- - !ruby/object:Gem::Version
80
- version: 0.2.4
81
61
  description: Protocol Buffers are Google's data interchange format.
82
62
  email: protobuf@googlegroups.com
83
63
  executables: []
@@ -85,21 +65,32 @@ extensions:
85
65
  - ext/google/protobuf_c/extconf.rb
86
66
  extra_rdoc_files: []
87
67
  files:
68
+ - ext/google/protobuf_c/convert.c
69
+ - ext/google/protobuf_c/convert.h
88
70
  - ext/google/protobuf_c/defs.c
89
- - ext/google/protobuf_c/encode_decode.c
71
+ - ext/google/protobuf_c/defs.h
90
72
  - ext/google/protobuf_c/extconf.rb
91
73
  - ext/google/protobuf_c/map.c
74
+ - ext/google/protobuf_c/map.h
92
75
  - ext/google/protobuf_c/message.c
76
+ - ext/google/protobuf_c/message.h
93
77
  - ext/google/protobuf_c/protobuf.c
94
78
  - ext/google/protobuf_c/protobuf.h
95
79
  - ext/google/protobuf_c/repeated_field.c
96
- - ext/google/protobuf_c/storage.c
97
- - ext/google/protobuf_c/upb.c
98
- - ext/google/protobuf_c/upb.h
80
+ - ext/google/protobuf_c/repeated_field.h
81
+ - ext/google/protobuf_c/ruby-upb.c
82
+ - ext/google/protobuf_c/ruby-upb.h
83
+ - ext/google/protobuf_c/third_party/utf8_range/LICENSE
84
+ - ext/google/protobuf_c/third_party/utf8_range/naive.c
85
+ - ext/google/protobuf_c/third_party/utf8_range/range2-neon.c
86
+ - ext/google/protobuf_c/third_party/utf8_range/range2-sse.c
87
+ - ext/google/protobuf_c/third_party/utf8_range/utf8_range.h
99
88
  - ext/google/protobuf_c/wrap_memcpy.c
100
89
  - lib/google/protobuf.rb
101
90
  - lib/google/protobuf/any_pb.rb
102
91
  - lib/google/protobuf/api_pb.rb
92
+ - lib/google/protobuf/descriptor_dsl.rb
93
+ - lib/google/protobuf/descriptor_pb.rb
103
94
  - lib/google/protobuf/duration_pb.rb
104
95
  - lib/google/protobuf/empty_pb.rb
105
96
  - lib/google/protobuf/field_mask_pb.rb
@@ -118,7 +109,7 @@ homepage: https://developers.google.com/protocol-buffers
118
109
  licenses:
119
110
  - BSD-3-Clause
120
111
  metadata:
121
- source_code_uri: https://github.com/protocolbuffers/protobuf/tree/v3.14.0/ruby
112
+ source_code_uri: https://github.com/protocolbuffers/protobuf/tree/v3.21.0/ruby
122
113
  post_install_message:
123
114
  rdoc_options: []
124
115
  require_paths:
@@ -134,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
125
  - !ruby/object:Gem::Version
135
126
  version: '0'
136
127
  requirements: []
137
- rubygems_version: 3.1.4
128
+ rubygems_version: 3.3.14
138
129
  signing_key:
139
130
  specification_version: 4
140
131
  summary: Protocol Buffers