protobuffy 3.6.0 → 4.0.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.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +67 -0
  4. data/.rubocop_todo.yml +145 -0
  5. data/.travis.yml +25 -5
  6. data/CHANGES.md +55 -0
  7. data/CONTRIBUTING.md +1 -1
  8. data/LICENSE.txt +17 -9
  9. data/README.md +13 -12
  10. data/Rakefile +15 -11
  11. data/bin/protoc-gen-ruby +8 -3
  12. data/bin/rpc_server +1 -0
  13. data/examples/lib/example/reverse-client.rb +2 -2
  14. data/install-protobuf.sh +28 -0
  15. data/lib/protobuf.rb +57 -53
  16. data/lib/protobuf/cli.rb +94 -74
  17. data/lib/protobuf/code_generator.rb +60 -9
  18. data/lib/protobuf/decoder.rb +19 -65
  19. data/lib/protobuf/deprecation.rb +117 -0
  20. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
  21. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
  22. data/lib/protobuf/encoder.rb +13 -53
  23. data/lib/protobuf/enum.rb +58 -63
  24. data/lib/protobuf/field.rb +4 -4
  25. data/lib/protobuf/field/base_field.rb +101 -173
  26. data/lib/protobuf/field/bool_field.rb +17 -11
  27. data/lib/protobuf/field/bytes_field.rb +21 -35
  28. data/lib/protobuf/field/double_field.rb +0 -1
  29. data/lib/protobuf/field/enum_field.rb +23 -22
  30. data/lib/protobuf/field/field_array.rb +5 -4
  31. data/lib/protobuf/field/fixed32_field.rb +1 -1
  32. data/lib/protobuf/field/fixed64_field.rb +0 -1
  33. data/lib/protobuf/field/float_field.rb +4 -1
  34. data/lib/protobuf/field/int32_field.rb +0 -1
  35. data/lib/protobuf/field/int64_field.rb +0 -1
  36. data/lib/protobuf/field/integer_field.rb +0 -1
  37. data/lib/protobuf/field/message_field.rb +13 -28
  38. data/lib/protobuf/field/sfixed32_field.rb +0 -1
  39. data/lib/protobuf/field/sfixed64_field.rb +0 -1
  40. data/lib/protobuf/field/signed_integer_field.rb +0 -1
  41. data/lib/protobuf/field/sint32_field.rb +0 -1
  42. data/lib/protobuf/field/sint64_field.rb +0 -1
  43. data/lib/protobuf/field/string_field.rb +2 -4
  44. data/lib/protobuf/field/uint32_field.rb +0 -1
  45. data/lib/protobuf/field/uint64_field.rb +0 -1
  46. data/lib/protobuf/field/varint_field.rb +30 -13
  47. data/lib/protobuf/generators/base.rb +30 -16
  48. data/lib/protobuf/generators/enum_generator.rb +6 -9
  49. data/lib/protobuf/generators/extension_generator.rb +1 -2
  50. data/lib/protobuf/generators/field_generator.rb +25 -13
  51. data/lib/protobuf/generators/file_generator.rb +157 -35
  52. data/lib/protobuf/generators/group_generator.rb +22 -17
  53. data/lib/protobuf/generators/message_generator.rb +13 -14
  54. data/lib/protobuf/generators/option_generator.rb +17 -0
  55. data/lib/protobuf/generators/printable.rb +12 -13
  56. data/lib/protobuf/generators/service_generator.rb +2 -3
  57. data/lib/protobuf/http.rb +2 -2
  58. data/lib/protobuf/lifecycle.rb +20 -33
  59. data/lib/protobuf/logging.rb +39 -0
  60. data/lib/protobuf/message.rb +114 -47
  61. data/lib/protobuf/message/fields.rb +170 -88
  62. data/lib/protobuf/message/serialization.rb +19 -18
  63. data/lib/protobuf/optionable.rb +53 -6
  64. data/lib/protobuf/rpc/buffer.rb +18 -19
  65. data/lib/protobuf/rpc/client.rb +22 -50
  66. data/lib/protobuf/rpc/connectors/base.rb +177 -12
  67. data/lib/protobuf/rpc/connectors/http.rb +14 -9
  68. data/lib/protobuf/rpc/connectors/ping.rb +89 -0
  69. data/lib/protobuf/rpc/connectors/socket.rb +13 -8
  70. data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
  71. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
  72. data/lib/protobuf/rpc/env.rb +12 -12
  73. data/lib/protobuf/rpc/error.rb +3 -3
  74. data/lib/protobuf/rpc/error/client_error.rb +4 -4
  75. data/lib/protobuf/rpc/error/server_error.rb +9 -9
  76. data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
  77. data/lib/protobuf/rpc/middleware/logger.rb +8 -4
  78. data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
  79. data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
  80. data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
  81. data/lib/protobuf/rpc/rpc.pb.rb +4 -1
  82. data/lib/protobuf/rpc/server.rb +1 -1
  83. data/lib/protobuf/rpc/servers/http/server.rb +19 -17
  84. data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
  85. data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
  86. data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
  87. data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
  88. data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
  89. data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
  90. data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
  91. data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
  92. data/lib/protobuf/rpc/service.rb +21 -27
  93. data/lib/protobuf/rpc/service_directory.rb +43 -27
  94. data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
  95. data/lib/protobuf/rpc/service_filters.rb +32 -55
  96. data/lib/protobuf/rpc/stat.rb +4 -8
  97. data/lib/protobuf/socket.rb +1 -2
  98. data/lib/protobuf/tasks/compile.rake +3 -4
  99. data/lib/protobuf/varint.rb +9 -0
  100. data/lib/protobuf/varint_pure.rb +13 -0
  101. data/lib/protobuf/version.rb +1 -1
  102. data/lib/protobuf/zmq.rb +2 -2
  103. data/proto/google/protobuf/descriptor.proto +190 -31
  104. data/protobuffy.gemspec +30 -17
  105. data/spec/benchmark/tasks.rb +27 -19
  106. data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
  107. data/spec/encoding/all_types_spec.rb +96 -84
  108. data/spec/encoding/extreme_values_spec.rb +0 -0
  109. data/spec/functional/class_inheritance_spec.rb +52 -0
  110. data/spec/functional/code_generator_spec.rb +38 -0
  111. data/spec/functional/socket_server_spec.rb +15 -15
  112. data/spec/functional/zmq_server_spec.rb +29 -27
  113. data/spec/lib/protobuf/cli_spec.rb +82 -67
  114. data/spec/lib/protobuf/code_generator_spec.rb +37 -10
  115. data/spec/lib/protobuf/enum_spec.rb +77 -46
  116. data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
  117. data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
  118. data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
  119. data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
  120. data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
  121. data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
  122. data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
  123. data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
  124. data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
  125. data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
  126. data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
  127. data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
  128. data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
  129. data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
  130. data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
  131. data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
  132. data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
  133. data/spec/lib/protobuf/field_spec.rb +4 -6
  134. data/spec/lib/protobuf/generators/base_spec.rb +80 -13
  135. data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
  136. data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
  137. data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
  138. data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
  139. data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
  140. data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
  141. data/spec/lib/protobuf/message_spec.rb +578 -79
  142. data/spec/lib/protobuf/optionable_spec.rb +202 -26
  143. data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
  144. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
  145. data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
  146. data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
  147. data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
  148. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
  149. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
  150. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
  151. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
  152. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
  153. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
  154. data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
  155. data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
  156. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
  157. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
  158. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
  159. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
  160. data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
  161. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
  162. data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
  163. data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
  164. data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
  165. data/spec/lib/protobuf/varint_spec.rb +29 -0
  166. data/spec/lib/protobuf_spec.rb +55 -28
  167. data/spec/spec_helper.rb +12 -27
  168. data/spec/support/all.rb +0 -1
  169. data/spec/support/packed_field.rb +4 -3
  170. data/spec/support/{test → protos}/all_types.data.bin +0 -0
  171. data/spec/support/{test → protos}/all_types.data.txt +0 -0
  172. data/spec/support/{test → protos}/enum.pb.rb +8 -4
  173. data/spec/support/{test → protos}/enum.proto +4 -1
  174. data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
  175. data/spec/support/protos/google_unittest.bin +0 -0
  176. data/spec/support/protos/google_unittest.pb.rb +798 -0
  177. data/spec/support/{test → protos}/google_unittest.proto +237 -66
  178. data/spec/support/protos/google_unittest_custom_options.bin +0 -0
  179. data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
  180. data/spec/support/protos/google_unittest_custom_options.proto +424 -0
  181. data/spec/support/protos/google_unittest_import.pb.rb +55 -0
  182. data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
  183. data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
  184. data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
  185. data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
  186. data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
  187. data/spec/support/{test → protos}/resource.pb.rb +47 -11
  188. data/spec/support/{test → protos}/resource.proto +24 -1
  189. data/spec/support/resource_service.rb +23 -0
  190. data/spec/support/server.rb +32 -61
  191. metadata +119 -59
  192. data/lib/protobuf/deprecator.rb +0 -42
  193. data/lib/protobuf/logger.rb +0 -93
  194. data/lib/protobuf/rpc/connector.rb +0 -21
  195. data/lib/protobuf/rpc/connectors/common.rb +0 -172
  196. data/spec/data/data.bin +0 -3
  197. data/spec/data/types.bin +0 -0
  198. data/spec/lib/protobuf/logger_spec.rb +0 -145
  199. data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
  200. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
  201. data/spec/support/test/defaults.pb.rb +0 -25
  202. data/spec/support/test/defaults.proto +0 -9
  203. data/spec/support/test/extended.pb.rb +0 -22
  204. data/spec/support/test/extended.proto +0 -10
  205. data/spec/support/test/google_unittest.pb.rb +0 -543
  206. data/spec/support/test/google_unittest_import.pb.rb +0 -37
  207. data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
  208. data/spec/support/test/resource_service.rb +0 -26
  209. data/spec/support/tolerance_matcher.rb +0 -40
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  require 'protobuf/code_generator'
4
4
 
5
- describe ::Protobuf::CodeGenerator do
5
+ RSpec.describe ::Protobuf::CodeGenerator do
6
6
 
7
7
  # Some constants to shorten things up
8
8
  DESCRIPTOR = ::Google::Protobuf
@@ -19,30 +19,58 @@ describe ::Protobuf::CodeGenerator do
19
19
  let(:file_generator2) { double('file generator 2', :generate_output_file => output_file2) }
20
20
 
21
21
  let(:request_bytes) do
22
- COMPILER::CodeGeneratorRequest.encode(:proto_file => [ input_file1, input_file2 ])
22
+ COMPILER::CodeGeneratorRequest.encode(:proto_file => [input_file1, input_file2])
23
23
  end
24
24
 
25
25
  let(:expected_response_bytes) do
26
- COMPILER::CodeGeneratorResponse.encode(:file => [ output_file1, output_file2 ])
26
+ COMPILER::CodeGeneratorResponse.encode(:file => [output_file1, output_file2])
27
27
  end
28
28
 
29
29
  before do
30
- ::Protobuf::Generators::FileGenerator.should_receive(:new).with(input_file1).and_return(file_generator1)
31
- ::Protobuf::Generators::FileGenerator.should_receive(:new).with(input_file2).and_return(file_generator2)
30
+ expect(::Protobuf::Generators::FileGenerator).to receive(:new).with(input_file1).and_return(file_generator1)
31
+ expect(::Protobuf::Generators::FileGenerator).to receive(:new).with(input_file2).and_return(file_generator2)
32
32
  end
33
33
 
34
34
  it 'returns the serialized CodeGeneratorResponse which contains the generated file contents' do
35
35
  generator = described_class.new(request_bytes)
36
- generator.response_bytes.should eq expected_response_bytes
36
+ expect(generator.response_bytes).to eq expected_response_bytes
37
+ end
38
+ end
39
+
40
+ describe '#eval_unknown_extensions' do
41
+ let(:input_file) do
42
+ DESCRIPTOR::FileDescriptorProto.new(
43
+ :name => 'test/boom.proto',
44
+ :package => 'test.pkg.code_generator_spec',
45
+ :extension => [{
46
+ :name => 'boom',
47
+ :number => 20100,
48
+ :label => Google::Protobuf::FieldDescriptorProto::Label::LABEL_OPTIONAL,
49
+ :type => Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING,
50
+ :extendee => '.google.protobuf.FieldOptions',
51
+ }]
52
+ )
53
+ end
54
+ let(:request_bytes) { COMPILER::CodeGeneratorRequest.encode(:proto_file => [input_file]) }
55
+
56
+ it 'evals files as they are generated' do
57
+ described_class.new(request_bytes).eval_unknown_extensions!
58
+ expect(Google::Protobuf::FieldOptions.extension_fields.map(&:fully_qualified_name)).to include(:'.test.pkg.code_generator_spec.boom')
59
+ expect(Google::Protobuf::FieldOptions.extension_fields.map(&:name)).to include(:boom)
60
+ added_extension = Google::Protobuf::FieldOptions.extension_fields.detect { |f| f.fully_qualified_name == :'.test.pkg.code_generator_spec.boom' }
61
+ expect(added_extension.name).to eq(:boom)
62
+ expect(added_extension.rule).to eq(:optional)
63
+ expect(added_extension.type_class).to eq(::Protobuf::Field::StringField)
64
+ expect(added_extension.tag).to eq(20100)
37
65
  end
38
66
  end
39
67
 
40
68
  context 'class-level printing methods' do
41
69
  describe '.fatal' do
42
70
  it 'raises a CodeGeneratorFatalError error' do
43
- expect {
71
+ expect do
44
72
  described_class.fatal("something is wrong")
45
- }.to raise_error(
73
+ end.to raise_error(
46
74
  ::Protobuf::CodeGenerator::CodeGeneratorFatalError,
47
75
  "something is wrong"
48
76
  )
@@ -51,10 +79,9 @@ describe ::Protobuf::CodeGenerator do
51
79
 
52
80
  describe '.warn' do
53
81
  it 'prints a warning to stderr' do
54
- STDERR.should_receive(:puts).with("[WARN] a warning")
82
+ expect(STDERR).to receive(:puts).with("[WARN] a warning")
55
83
  described_class.warn("a warning")
56
84
  end
57
85
  end
58
86
  end
59
-
60
87
  end
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
+ require PROTOS_PATH.join('enum.pb')
2
3
 
3
- describe Protobuf::Enum do
4
+ RSpec.describe Protobuf::Enum do
4
5
 
5
6
  describe 'class dsl' do
6
7
  let(:name) { :THREE }
@@ -22,7 +23,7 @@ describe Protobuf::Enum do
22
23
 
23
24
  describe '.aliases_allowed?' do
24
25
  it 'is false when the option is not set' do
25
- expect(Test::EnumTestType.aliases_allowed?).to be_false
26
+ expect(Test::EnumTestType.aliases_allowed?).to be false
26
27
  end
27
28
  end
28
29
 
@@ -40,40 +41,45 @@ describe Protobuf::Enum do
40
41
  end
41
42
 
42
43
  it 'allows defining enums with the same tag number' do
43
- expect {
44
+ expect do
44
45
  DefineEnumAlias.define(:FOO, 1)
45
46
  DefineEnumAlias.define(:BAR, 1)
46
- }.not_to raise_error
47
+ end.not_to raise_error
47
48
  end
48
49
  end
49
50
  end
50
51
 
51
52
  describe '.enums' do
52
53
  it 'provides an array of defined Enums' do
53
- expect(Test::EnumTestType.enums).to eq([
54
- Test::EnumTestType::ONE,
55
- Test::EnumTestType::TWO,
56
- Test::EnumTestType::MINUS_ONE,
57
- Test::EnumTestType::THREE
58
- ])
54
+ expect(Test::EnumTestType.enums).to eq(
55
+ [
56
+ Test::EnumTestType::ZERO,
57
+ Test::EnumTestType::ONE,
58
+ Test::EnumTestType::TWO,
59
+ Test::EnumTestType::MINUS_ONE,
60
+ Test::EnumTestType::THREE,
61
+ ]
62
+ )
59
63
  end
60
64
 
61
65
  context 'when enum allows aliases' do
62
66
  it 'treats aliased enums as valid' do
63
- expect(EnumAliasTest.enums).to eq([
64
- EnumAliasTest::FOO,
65
- EnumAliasTest::BAR,
66
- EnumAliasTest::BAZ
67
- ])
67
+ expect(EnumAliasTest.enums).to eq(
68
+ [
69
+ EnumAliasTest::FOO,
70
+ EnumAliasTest::BAR,
71
+ EnumAliasTest::BAZ,
72
+ ]
73
+ )
68
74
  end
69
75
  end
70
76
  end
71
77
 
72
-
73
78
  describe '.enums_for_tag' do
74
79
  it 'returns an array of Enums for the given tag, if any' do
75
- expect(EnumAliasTest.enums_for_tag(1)).to eq([ EnumAliasTest::FOO, EnumAliasTest::BAR ])
76
- expect(EnumAliasTest.enums_for_tag(2)).to eq([ EnumAliasTest::BAZ ])
80
+ expect(EnumAliasTest.enums_for_tag(nil)).to eq([])
81
+ expect(EnumAliasTest.enums_for_tag(1)).to eq([EnumAliasTest::FOO, EnumAliasTest::BAR])
82
+ expect(EnumAliasTest.enums_for_tag(2)).to eq([EnumAliasTest::BAZ])
77
83
  expect(EnumAliasTest.enums_for_tag(3)).to eq([])
78
84
  end
79
85
  end
@@ -120,6 +126,7 @@ describe Protobuf::Enum do
120
126
  it 'gets the Enum corresponding to the given tag' do
121
127
  expect(Test::EnumTestType.enum_for_tag(tag)).to eq(Test::EnumTestType.const_get(name))
122
128
  expect(Test::EnumTestType.enum_for_tag(-5)).to be_nil
129
+ expect(Test::EnumTestType.enum_for_tag(nil)).to be_nil
123
130
  end
124
131
  end
125
132
 
@@ -155,15 +162,15 @@ describe Protobuf::Enum do
155
162
 
156
163
  describe '.valid_tag?' do
157
164
  context 'when tag is defined' do
158
- specify { expect(Test::EnumTestType.valid_tag?(tag)).to be_true }
165
+ specify { expect(Test::EnumTestType.valid_tag?(tag)).to be true }
159
166
  end
160
167
 
161
168
  context 'when tag is not defined' do
162
- specify { expect(Test::EnumTestType.valid_tag?(300)).to be_false }
169
+ specify { expect(Test::EnumTestType.valid_tag?(300)).to be false }
163
170
  end
164
171
 
165
172
  context 'is true for aliased enums' do
166
- specify { expect(EnumAliasTest.valid_tag?(1)).to be_true }
173
+ specify { expect(EnumAliasTest.valid_tag?(1)).to be true }
167
174
  end
168
175
  end
169
176
 
@@ -174,21 +181,27 @@ describe Protobuf::Enum do
174
181
  end
175
182
 
176
183
  describe '.values' do
184
+ around do |example|
185
+ # this method is deprecated
186
+ ::Protobuf.deprecator.silence(&example)
187
+ end
188
+
177
189
  it 'provides a hash of defined Enums' do
178
- expect(Test::EnumTestType.values).to eq({
190
+ expect(Test::EnumTestType.values).to eq(
179
191
  :MINUS_ONE => Test::EnumTestType::MINUS_ONE,
192
+ :ZERO => Test::EnumTestType::ZERO,
180
193
  :ONE => Test::EnumTestType::ONE,
181
194
  :TWO => Test::EnumTestType::TWO,
182
195
  :THREE => Test::EnumTestType::THREE
183
- })
196
+ )
184
197
  end
185
198
 
186
199
  it 'contains aliased Enums' do
187
- expect(EnumAliasTest.values).to eq({
200
+ expect(EnumAliasTest.values).to eq(
188
201
  :FOO => EnumAliasTest::FOO,
189
202
  :BAR => EnumAliasTest::BAR,
190
203
  :BAZ => EnumAliasTest::BAZ
191
- })
204
+ )
192
205
  end
193
206
  end
194
207
 
@@ -200,37 +213,55 @@ describe Protobuf::Enum do
200
213
  end
201
214
  end
202
215
 
203
- subject { Test::EnumTestType::ONE }
204
- its(:class) { should eq(Fixnum) }
205
- its(:parent_class) { should eq(Test::EnumTestType) }
206
- its(:name) { should eq(:ONE) }
207
- its(:tag) { should eq(1) }
208
- its(:value) { should eq(1) }
209
- its(:to_hash_value) { should eq(1) }
210
- its(:to_s) { should eq("1") }
211
- its(:inspect) { should eq('#<Protobuf::Enum(Test::EnumTestType)::ONE=1>') }
212
- specify { subject.to_s(:tag).should eq("1") }
213
- specify { subject.to_s(:name).should eq("ONE") }
216
+ subject { Test::EnumTestType::ONE }
217
+ specify { expect(subject.class).to eq(Fixnum) }
218
+ specify { expect(subject.parent_class).to eq(Test::EnumTestType) }
219
+ specify { expect(subject.name).to eq(:ONE) }
220
+ specify { expect(subject.tag).to eq(1) }
221
+
222
+ context 'deprecated' do
223
+ around do |example|
224
+ # this method is deprecated
225
+ ::Protobuf.deprecator.silence(&example)
226
+ end
227
+
228
+ specify { expect(subject.value).to eq(1) }
229
+ end
230
+
231
+ specify { expect(subject.to_hash_value).to eq(1) }
232
+ specify { expect(subject.to_s).to eq("1") }
233
+ specify { expect(subject.inspect).to eq('#<Protobuf::Enum(Test::EnumTestType)::ONE=1>') }
234
+ specify { expect(subject.to_s(:tag)).to eq("1") }
235
+ specify { expect(subject.to_s(:name)).to eq("ONE") }
214
236
 
215
237
  it "can be used as the index to an array" do
216
238
  array = [0, 1, 2, 3]
217
- array[::Test::EnumTestType::ONE].should eq(1)
239
+ expect(array[::Test::EnumTestType::ONE]).to eq(1)
218
240
  end
219
241
 
220
242
  describe '#try' do
221
- specify { subject.try(:parent_class).should eq(subject.parent_class) }
222
- specify { subject.try(:class).should eq(subject.class) }
223
- specify { subject.try(:name).should eq(subject.name) }
224
- specify { subject.try(:tag).should eq(subject.tag) }
225
- specify { subject.try(:value).should eq(subject.value) }
226
- specify { subject.try(:to_i).should eq(subject.to_i) }
227
- specify { subject.try(:to_int).should eq(subject.to_int) }
228
- specify { subject.try { |yielded| yielded.should eq(subject) } }
243
+ specify { expect(subject.try(:parent_class)).to eq(subject.parent_class) }
244
+ specify { expect(subject.try(:class)).to eq(subject.class) }
245
+ specify { expect(subject.try(:name)).to eq(subject.name) }
246
+ specify { expect(subject.try(:tag)).to eq(subject.tag) }
247
+
248
+ context 'deprecated' do
249
+ around do |example|
250
+ # this method is deprecated
251
+ ::Protobuf.deprecator.silence(&example)
252
+ end
253
+
254
+ specify { expect(subject.try(:value)).to eq(subject.value) }
255
+ end
256
+
257
+ specify { expect(subject.try(:to_i)).to eq(subject.to_i) }
258
+ specify { expect(subject.try(:to_int)).to eq(subject.to_int) }
259
+ specify { subject.try { |yielded| expect(yielded).to eq(subject) } }
229
260
  end
230
261
 
231
262
  context 'when coercing from enum' do
232
263
  subject { Test::StatusType::PENDING }
233
- it { should eq(0) }
264
+ it { is_expected.to eq(0) }
234
265
  end
235
266
 
236
267
  context 'when coercing from integer' do
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Protobuf::Field::BoolField do
4
+
5
+ it_behaves_like :packable_field, described_class do
6
+ let(:value) { [true, false] }
7
+ end
8
+
9
+ class SomeBoolMessage < ::Protobuf::Message
10
+ optional :bool, :some_bool, 1
11
+ required :bool, :required_bool, 2
12
+ end
13
+
14
+ let(:instance) { SomeBoolMessage.new }
15
+
16
+ describe 'setting and getting field' do
17
+ subject { instance.some_bool = value; instance.some_bool }
18
+
19
+ [true, false].each do |val|
20
+ context "when set with #{val}" do
21
+ let(:value) { val }
22
+
23
+ it 'is readable as a bool' do
24
+ expect(subject).to eq(val)
25
+ end
26
+ end
27
+ end
28
+
29
+ [['true', true], ['false', false]].each do |val, expected|
30
+ context "when set with a string of #{val}" do
31
+ let(:value) { val }
32
+
33
+ it 'is readable as a bool' do
34
+ expect(subject).to eq(expected)
35
+ end
36
+ end
37
+ end
38
+
39
+ context 'when set with a non-bool string' do
40
+ let(:value) { "aaaa" }
41
+
42
+ it 'throws an error' do
43
+ expect { subject }.to raise_error(TypeError)
44
+ end
45
+ end
46
+
47
+ context 'when set with something that is not a bool' do
48
+ let(:value) { [1, 2, 3] }
49
+
50
+ it 'throws an error' do
51
+ expect { subject }.to raise_error(TypeError)
52
+ end
53
+ end
54
+ end
55
+
56
+ it 'defines ? method' do
57
+ instance.required_bool = false
58
+ expect(instance.required_bool?).to be(false)
59
+ end
60
+
61
+ describe '#default_value' do
62
+ context 'optional and required fields' do
63
+ it 'returns the class default' do
64
+ expect(SomeBoolMessage.get_field('some_bool').default).to be nil
65
+ expect(::Protobuf::Field::BoolField.default).to be false
66
+ expect(instance.some_bool).to be false
67
+ end
68
+
69
+ context 'with field default' do
70
+ class AnotherBoolMessage < ::Protobuf::Message
71
+ optional :bool, :set_bool, 1, :default => true
72
+ end
73
+
74
+ it 'returns the set default' do
75
+ expect(AnotherBoolMessage.get_field('set_bool').default).to be true
76
+ expect(AnotherBoolMessage.new.set_bool).to be true
77
+ end
78
+ end
79
+ end
80
+
81
+ context 'repeated field' do
82
+ class RepeatedBoolMessage < ::Protobuf::Message
83
+ repeated :bool, :repeated_bool, 1
84
+ end
85
+
86
+ it 'returns the set default' do
87
+ expect(RepeatedBoolMessage.new.repeated_bool).to eq []
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Protobuf::Field::DoubleField do
4
+
5
+ it_behaves_like :packable_field, described_class do
6
+ let(:value) { [1.0, 2.0, 3.0] }
7
+ end
8
+
9
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Protobuf::Field::EnumField do
4
+ let(:message) do
5
+ Class.new(::Protobuf::Message) do
6
+ enum_class = Class.new(::Protobuf::Enum) do
7
+ define :POSITIVE, 22
8
+ define :NEGATIVE, -33
9
+ end
10
+
11
+ optional enum_class, :enum, 1
12
+ end
13
+ end
14
+
15
+ describe '.{encode, decode}' do
16
+ it 'handles positive enum constants' do
17
+ instance = message.new(:enum => :POSITIVE)
18
+ expect(message.decode(instance.encode).enum).to eq(22)
19
+ end
20
+
21
+ it 'handles negative enum constants' do
22
+ instance = message.new(:enum => :NEGATIVE)
23
+ expect(message.decode(instance.encode).enum).to eq(-33)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Protobuf::Field::FieldArray do
4
+
5
+ class SomeBasicMessage < ::Protobuf::Message
6
+ optional :string, :field, 1
7
+ end
8
+
9
+ class MoreComplexMessage < SomeBasicMessage
10
+ end
11
+
12
+ class OtherBasicMessage < ::Protobuf::Message
13
+ optional :string, :other_field, 1
14
+ end
15
+
16
+ class SomeRepeatMessage < ::Protobuf::Message
17
+ optional :string, :some_string, 1
18
+ repeated :string, :multiple_strings, 2
19
+ repeated SomeBasicMessage, :multiple_basic_msgs, 3
20
+ end
21
+
22
+ let(:instance) { SomeRepeatMessage.new }
23
+
24
+ %w(<< push).each do |method|
25
+ describe "\##{method}" do
26
+ context 'when applied to a string field array' do
27
+ it 'adds a string' do
28
+ expect(instance.multiple_strings).to be_empty
29
+ instance.multiple_strings.send(method, 'string 1')
30
+ expect(instance.multiple_strings).to eq(['string 1'])
31
+ instance.multiple_strings.send(method, 'string 2')
32
+ expect(instance.multiple_strings).to eq(['string 1', 'string 2'])
33
+ end
34
+
35
+ it 'fails if not adding a string' do
36
+ expect { instance.multiple_strings.send(method, 100.0) }.to raise_error(TypeError)
37
+ end
38
+ end
39
+
40
+ context 'when applied to a MessageField field array' do
41
+ it 'adds a MessageField object' do
42
+ expect(instance.multiple_basic_msgs).to be_empty
43
+ basic_msg1 = SomeBasicMessage.new
44
+ instance.multiple_basic_msgs.send(method, basic_msg1)
45
+ expect(instance.multiple_basic_msgs).to eq([basic_msg1])
46
+ basic_msg2 = SomeBasicMessage.new
47
+ instance.multiple_basic_msgs.send(method, basic_msg2)
48
+ expect(instance.multiple_basic_msgs).to eq([basic_msg1, basic_msg2])
49
+ end
50
+
51
+ it 'adds a Hash from a MessageField object' do
52
+ expect(instance.multiple_basic_msgs).to be_empty
53
+ basic_msg1 = SomeBasicMessage.new
54
+ basic_msg1.field = 'my value'
55
+ instance.multiple_basic_msgs.send(method, basic_msg1.to_hash)
56
+ expect(instance.multiple_basic_msgs).to eq([basic_msg1])
57
+ end
58
+
59
+ it 'does not downcast a MessageField' do
60
+ expect(instance.multiple_basic_msgs).to be_empty
61
+ basic_msg1 = MoreComplexMessage.new
62
+ instance.multiple_basic_msgs.send(method, basic_msg1)
63
+ expect(instance.multiple_basic_msgs).to eq([basic_msg1])
64
+ expect(instance.multiple_basic_msgs.first).to be_a(MoreComplexMessage)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end