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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +67 -0
- data/.rubocop_todo.yml +145 -0
- data/.travis.yml +25 -5
- data/CHANGES.md +55 -0
- data/CONTRIBUTING.md +1 -1
- data/LICENSE.txt +17 -9
- data/README.md +13 -12
- data/Rakefile +15 -11
- data/bin/protoc-gen-ruby +8 -3
- data/bin/rpc_server +1 -0
- data/examples/lib/example/reverse-client.rb +2 -2
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +57 -53
- data/lib/protobuf/cli.rb +94 -74
- data/lib/protobuf/code_generator.rb +60 -9
- data/lib/protobuf/decoder.rb +19 -65
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
- data/lib/protobuf/encoder.rb +13 -53
- data/lib/protobuf/enum.rb +58 -63
- data/lib/protobuf/field.rb +4 -4
- data/lib/protobuf/field/base_field.rb +101 -173
- data/lib/protobuf/field/bool_field.rb +17 -11
- data/lib/protobuf/field/bytes_field.rb +21 -35
- data/lib/protobuf/field/double_field.rb +0 -1
- data/lib/protobuf/field/enum_field.rb +23 -22
- data/lib/protobuf/field/field_array.rb +5 -4
- data/lib/protobuf/field/fixed32_field.rb +1 -1
- data/lib/protobuf/field/fixed64_field.rb +0 -1
- data/lib/protobuf/field/float_field.rb +4 -1
- data/lib/protobuf/field/int32_field.rb +0 -1
- data/lib/protobuf/field/int64_field.rb +0 -1
- data/lib/protobuf/field/integer_field.rb +0 -1
- data/lib/protobuf/field/message_field.rb +13 -28
- data/lib/protobuf/field/sfixed32_field.rb +0 -1
- data/lib/protobuf/field/sfixed64_field.rb +0 -1
- data/lib/protobuf/field/signed_integer_field.rb +0 -1
- data/lib/protobuf/field/sint32_field.rb +0 -1
- data/lib/protobuf/field/sint64_field.rb +0 -1
- data/lib/protobuf/field/string_field.rb +2 -4
- data/lib/protobuf/field/uint32_field.rb +0 -1
- data/lib/protobuf/field/uint64_field.rb +0 -1
- data/lib/protobuf/field/varint_field.rb +30 -13
- data/lib/protobuf/generators/base.rb +30 -16
- data/lib/protobuf/generators/enum_generator.rb +6 -9
- data/lib/protobuf/generators/extension_generator.rb +1 -2
- data/lib/protobuf/generators/field_generator.rb +25 -13
- data/lib/protobuf/generators/file_generator.rb +157 -35
- data/lib/protobuf/generators/group_generator.rb +22 -17
- data/lib/protobuf/generators/message_generator.rb +13 -14
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +12 -13
- data/lib/protobuf/generators/service_generator.rb +2 -3
- data/lib/protobuf/http.rb +2 -2
- data/lib/protobuf/lifecycle.rb +20 -33
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +114 -47
- data/lib/protobuf/message/fields.rb +170 -88
- data/lib/protobuf/message/serialization.rb +19 -18
- data/lib/protobuf/optionable.rb +53 -6
- data/lib/protobuf/rpc/buffer.rb +18 -19
- data/lib/protobuf/rpc/client.rb +22 -50
- data/lib/protobuf/rpc/connectors/base.rb +177 -12
- data/lib/protobuf/rpc/connectors/http.rb +14 -9
- data/lib/protobuf/rpc/connectors/ping.rb +89 -0
- data/lib/protobuf/rpc/connectors/socket.rb +13 -8
- data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
- data/lib/protobuf/rpc/env.rb +12 -12
- data/lib/protobuf/rpc/error.rb +3 -3
- data/lib/protobuf/rpc/error/client_error.rb +4 -4
- data/lib/protobuf/rpc/error/server_error.rb +9 -9
- data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
- data/lib/protobuf/rpc/middleware/logger.rb +8 -4
- data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
- data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
- data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
- data/lib/protobuf/rpc/rpc.pb.rb +4 -1
- data/lib/protobuf/rpc/server.rb +1 -1
- data/lib/protobuf/rpc/servers/http/server.rb +19 -17
- data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
- data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
- data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
- data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
- data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
- data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
- data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
- data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
- data/lib/protobuf/rpc/service.rb +21 -27
- data/lib/protobuf/rpc/service_directory.rb +43 -27
- data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
- data/lib/protobuf/rpc/service_filters.rb +32 -55
- data/lib/protobuf/rpc/stat.rb +4 -8
- data/lib/protobuf/socket.rb +1 -2
- data/lib/protobuf/tasks/compile.rake +3 -4
- data/lib/protobuf/varint.rb +9 -0
- data/lib/protobuf/varint_pure.rb +13 -0
- data/lib/protobuf/version.rb +1 -1
- data/lib/protobuf/zmq.rb +2 -2
- data/proto/google/protobuf/descriptor.proto +190 -31
- data/protobuffy.gemspec +30 -17
- data/spec/benchmark/tasks.rb +27 -19
- data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
- data/spec/encoding/all_types_spec.rb +96 -84
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/class_inheritance_spec.rb +52 -0
- data/spec/functional/code_generator_spec.rb +38 -0
- data/spec/functional/socket_server_spec.rb +15 -15
- data/spec/functional/zmq_server_spec.rb +29 -27
- data/spec/lib/protobuf/cli_spec.rb +82 -67
- data/spec/lib/protobuf/code_generator_spec.rb +37 -10
- data/spec/lib/protobuf/enum_spec.rb +77 -46
- data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
- data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
- data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
- data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
- data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
- data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field_spec.rb +4 -6
- data/spec/lib/protobuf/generators/base_spec.rb +80 -13
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
- data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
- data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
- data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
- data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
- data/spec/lib/protobuf/message_spec.rb +578 -79
- data/spec/lib/protobuf/optionable_spec.rb +202 -26
- data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
- data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
- data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
- data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
- data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
- data/spec/lib/protobuf/varint_spec.rb +29 -0
- data/spec/lib/protobuf_spec.rb +55 -28
- data/spec/spec_helper.rb +12 -27
- data/spec/support/all.rb +0 -1
- data/spec/support/packed_field.rb +4 -3
- data/spec/support/{test → protos}/all_types.data.bin +0 -0
- data/spec/support/{test → protos}/all_types.data.txt +0 -0
- data/spec/support/{test → protos}/enum.pb.rb +8 -4
- data/spec/support/{test → protos}/enum.proto +4 -1
- data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
- data/spec/support/protos/google_unittest.bin +0 -0
- data/spec/support/protos/google_unittest.pb.rb +798 -0
- data/spec/support/{test → protos}/google_unittest.proto +237 -66
- data/spec/support/protos/google_unittest_custom_options.bin +0 -0
- data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
- data/spec/support/protos/google_unittest_custom_options.proto +424 -0
- data/spec/support/protos/google_unittest_import.pb.rb +55 -0
- data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
- data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
- data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
- data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
- data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
- data/spec/support/{test → protos}/resource.pb.rb +47 -11
- data/spec/support/{test → protos}/resource.proto +24 -1
- data/spec/support/resource_service.rb +23 -0
- data/spec/support/server.rb +32 -61
- metadata +119 -59
- data/lib/protobuf/deprecator.rb +0 -42
- data/lib/protobuf/logger.rb +0 -93
- data/lib/protobuf/rpc/connector.rb +0 -21
- data/lib/protobuf/rpc/connectors/common.rb +0 -172
- data/spec/data/data.bin +0 -3
- data/spec/data/types.bin +0 -0
- data/spec/lib/protobuf/logger_spec.rb +0 -145
- data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
- data/spec/support/test/defaults.pb.rb +0 -25
- data/spec/support/test/defaults.proto +0 -9
- data/spec/support/test/extended.pb.rb +0 -22
- data/spec/support/test/extended.proto +0 -10
- data/spec/support/test/google_unittest.pb.rb +0 -543
- data/spec/support/test/google_unittest_import.pb.rb +0 -37
- data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
- data/spec/support/test/resource_service.rb +0 -26
- 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 => [
|
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 => [
|
26
|
+
COMPILER::CodeGeneratorResponse.encode(:file => [output_file1, output_file2])
|
27
27
|
end
|
28
28
|
|
29
29
|
before do
|
30
|
-
::Protobuf::Generators::FileGenerator.
|
31
|
-
::Protobuf::Generators::FileGenerator.
|
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.
|
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
|
-
|
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.
|
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
|
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
|
-
|
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
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
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
|
-
|
65
|
-
|
66
|
-
|
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(
|
76
|
-
expect(EnumAliasTest.enums_for_tag(
|
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
|
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
|
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
|
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
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
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].
|
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).
|
222
|
-
specify { subject.try(:class).
|
223
|
-
specify { subject.try(:name).
|
224
|
-
specify { subject.try(:tag).
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
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 {
|
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,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
|