prepor-protobuf 3.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.
Files changed (182) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rubocop.yml +51 -0
  4. data/.rubocop_todo.yml +89 -0
  5. data/.travis.yml +25 -0
  6. data/.yardopts +5 -0
  7. data/CHANGES.md +256 -0
  8. data/CONTRIBUTING.md +16 -0
  9. data/Gemfile +3 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +33 -0
  12. data/Rakefile +64 -0
  13. data/bin/protoc-gen-ruby +16 -0
  14. data/bin/rpc_server +5 -0
  15. data/install-protobuf.sh +28 -0
  16. data/lib/protobuf.rb +100 -0
  17. data/lib/protobuf/cli.rb +242 -0
  18. data/lib/protobuf/code_generator.rb +44 -0
  19. data/lib/protobuf/decoder.rb +73 -0
  20. data/lib/protobuf/deprecation.rb +112 -0
  21. data/lib/protobuf/descriptors.rb +3 -0
  22. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +48 -0
  23. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +251 -0
  24. data/lib/protobuf/encoder.rb +67 -0
  25. data/lib/protobuf/enum.rb +303 -0
  26. data/lib/protobuf/exceptions.rb +9 -0
  27. data/lib/protobuf/field.rb +74 -0
  28. data/lib/protobuf/field/base_field.rb +267 -0
  29. data/lib/protobuf/field/bool_field.rb +59 -0
  30. data/lib/protobuf/field/bytes_field.rb +82 -0
  31. data/lib/protobuf/field/double_field.rb +25 -0
  32. data/lib/protobuf/field/enum_field.rb +68 -0
  33. data/lib/protobuf/field/field_array.rb +87 -0
  34. data/lib/protobuf/field/fixed32_field.rb +25 -0
  35. data/lib/protobuf/field/fixed64_field.rb +28 -0
  36. data/lib/protobuf/field/float_field.rb +41 -0
  37. data/lib/protobuf/field/int32_field.rb +21 -0
  38. data/lib/protobuf/field/int64_field.rb +21 -0
  39. data/lib/protobuf/field/integer_field.rb +23 -0
  40. data/lib/protobuf/field/message_field.rb +65 -0
  41. data/lib/protobuf/field/sfixed32_field.rb +27 -0
  42. data/lib/protobuf/field/sfixed64_field.rb +28 -0
  43. data/lib/protobuf/field/signed_integer_field.rb +29 -0
  44. data/lib/protobuf/field/sint32_field.rb +21 -0
  45. data/lib/protobuf/field/sint64_field.rb +21 -0
  46. data/lib/protobuf/field/string_field.rb +34 -0
  47. data/lib/protobuf/field/uint32_field.rb +21 -0
  48. data/lib/protobuf/field/uint64_field.rb +21 -0
  49. data/lib/protobuf/field/varint_field.rb +73 -0
  50. data/lib/protobuf/generators/base.rb +70 -0
  51. data/lib/protobuf/generators/enum_generator.rb +41 -0
  52. data/lib/protobuf/generators/extension_generator.rb +27 -0
  53. data/lib/protobuf/generators/field_generator.rb +131 -0
  54. data/lib/protobuf/generators/file_generator.rb +135 -0
  55. data/lib/protobuf/generators/group_generator.rb +112 -0
  56. data/lib/protobuf/generators/message_generator.rb +98 -0
  57. data/lib/protobuf/generators/printable.rb +160 -0
  58. data/lib/protobuf/generators/service_generator.rb +26 -0
  59. data/lib/protobuf/lifecycle.rb +33 -0
  60. data/lib/protobuf/logging.rb +39 -0
  61. data/lib/protobuf/message.rb +193 -0
  62. data/lib/protobuf/message/fields.rb +133 -0
  63. data/lib/protobuf/message/serialization.rb +89 -0
  64. data/lib/protobuf/optionable.rb +23 -0
  65. data/lib/protobuf/rpc/buffer.rb +77 -0
  66. data/lib/protobuf/rpc/client.rb +168 -0
  67. data/lib/protobuf/rpc/connector.rb +19 -0
  68. data/lib/protobuf/rpc/connectors/base.rb +55 -0
  69. data/lib/protobuf/rpc/connectors/common.rb +176 -0
  70. data/lib/protobuf/rpc/connectors/socket.rb +73 -0
  71. data/lib/protobuf/rpc/connectors/zmq.rb +322 -0
  72. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +49 -0
  73. data/lib/protobuf/rpc/env.rb +58 -0
  74. data/lib/protobuf/rpc/error.rb +28 -0
  75. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  76. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  77. data/lib/protobuf/rpc/middleware.rb +25 -0
  78. data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
  79. data/lib/protobuf/rpc/middleware/logger.rb +91 -0
  80. data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
  81. data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
  82. data/lib/protobuf/rpc/middleware/runner.rb +18 -0
  83. data/lib/protobuf/rpc/rpc.pb.rb +55 -0
  84. data/lib/protobuf/rpc/server.rb +39 -0
  85. data/lib/protobuf/rpc/servers/socket/server.rb +123 -0
  86. data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
  87. data/lib/protobuf/rpc/servers/socket_runner.rb +40 -0
  88. data/lib/protobuf/rpc/servers/zmq/broker.rb +193 -0
  89. data/lib/protobuf/rpc/servers/zmq/server.rb +320 -0
  90. data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
  91. data/lib/protobuf/rpc/servers/zmq/worker.rb +104 -0
  92. data/lib/protobuf/rpc/servers/zmq_runner.rb +62 -0
  93. data/lib/protobuf/rpc/service.rb +179 -0
  94. data/lib/protobuf/rpc/service_directory.rb +253 -0
  95. data/lib/protobuf/rpc/service_dispatcher.rb +46 -0
  96. data/lib/protobuf/rpc/service_filters.rb +272 -0
  97. data/lib/protobuf/rpc/stat.rb +97 -0
  98. data/lib/protobuf/socket.rb +21 -0
  99. data/lib/protobuf/tasks.rb +1 -0
  100. data/lib/protobuf/tasks/compile.rake +61 -0
  101. data/lib/protobuf/version.rb +3 -0
  102. data/lib/protobuf/wire_type.rb +10 -0
  103. data/lib/protobuf/zmq.rb +21 -0
  104. data/proto/dynamic_discovery.proto +44 -0
  105. data/proto/google/protobuf/compiler/plugin.proto +147 -0
  106. data/proto/google/protobuf/descriptor.proto +620 -0
  107. data/proto/rpc.proto +62 -0
  108. data/protobuf.gemspec +51 -0
  109. data/spec/benchmark/tasks.rb +139 -0
  110. data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
  111. data/spec/data/data.bin +3 -0
  112. data/spec/data/types.bin +0 -0
  113. data/spec/encoding/all_types_spec.rb +105 -0
  114. data/spec/encoding/extreme_values_spec.rb +0 -0
  115. data/spec/functional/class_inheritance_spec.rb +52 -0
  116. data/spec/functional/socket_server_spec.rb +59 -0
  117. data/spec/functional/zmq_server_spec.rb +105 -0
  118. data/spec/lib/protobuf/cli_spec.rb +273 -0
  119. data/spec/lib/protobuf/code_generator_spec.rb +60 -0
  120. data/spec/lib/protobuf/enum_spec.rb +265 -0
  121. data/spec/lib/protobuf/field/bool_field_spec.rb +51 -0
  122. data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
  123. data/spec/lib/protobuf/field/float_field_spec.rb +55 -0
  124. data/spec/lib/protobuf/field/int32_field_spec.rb +89 -0
  125. data/spec/lib/protobuf/field/string_field_spec.rb +45 -0
  126. data/spec/lib/protobuf/field_spec.rb +191 -0
  127. data/spec/lib/protobuf/generators/base_spec.rb +84 -0
  128. data/spec/lib/protobuf/generators/enum_generator_spec.rb +73 -0
  129. data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
  130. data/spec/lib/protobuf/generators/field_generator_spec.rb +102 -0
  131. data/spec/lib/protobuf/generators/file_generator_spec.rb +32 -0
  132. data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
  133. data/spec/lib/protobuf/generators/service_generator_spec.rb +46 -0
  134. data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
  135. data/spec/lib/protobuf/message_spec.rb +526 -0
  136. data/spec/lib/protobuf/optionable_spec.rb +46 -0
  137. data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
  138. data/spec/lib/protobuf/rpc/connector_spec.rb +26 -0
  139. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
  140. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +170 -0
  141. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
  142. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +117 -0
  143. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
  144. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
  145. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
  146. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
  147. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
  148. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +43 -0
  149. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
  150. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
  151. data/spec/lib/protobuf/rpc/service_directory_spec.rb +293 -0
  152. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +52 -0
  153. data/spec/lib/protobuf/rpc/service_filters_spec.rb +517 -0
  154. data/spec/lib/protobuf/rpc/service_spec.rb +162 -0
  155. data/spec/lib/protobuf/rpc/stat_spec.rb +68 -0
  156. data/spec/lib/protobuf_spec.rb +98 -0
  157. data/spec/spec_helper.rb +44 -0
  158. data/spec/support/all.rb +6 -0
  159. data/spec/support/packed_field.rb +22 -0
  160. data/spec/support/server.rb +64 -0
  161. data/spec/support/test/all_types.data.bin +0 -0
  162. data/spec/support/test/all_types.data.txt +119 -0
  163. data/spec/support/test/defaults.pb.rb +27 -0
  164. data/spec/support/test/defaults.proto +9 -0
  165. data/spec/support/test/enum.pb.rb +55 -0
  166. data/spec/support/test/enum.proto +34 -0
  167. data/spec/support/test/extended.pb.rb +18 -0
  168. data/spec/support/test/extended.proto +10 -0
  169. data/spec/support/test/extreme_values.data.bin +0 -0
  170. data/spec/support/test/google_unittest.pb.rb +537 -0
  171. data/spec/support/test/google_unittest.proto +713 -0
  172. data/spec/support/test/google_unittest_import.pb.rb +39 -0
  173. data/spec/support/test/google_unittest_import.proto +64 -0
  174. data/spec/support/test/google_unittest_import_public.pb.rb +10 -0
  175. data/spec/support/test/google_unittest_import_public.proto +38 -0
  176. data/spec/support/test/multi_field_extensions.pb.rb +58 -0
  177. data/spec/support/test/multi_field_extensions.proto +33 -0
  178. data/spec/support/test/resource.pb.rb +119 -0
  179. data/spec/support/test/resource.proto +94 -0
  180. data/spec/support/test/resource_service.rb +23 -0
  181. data/spec/support/test_app_file.rb +2 -0
  182. metadata +502 -0
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ require 'protobuf/code_generator'
4
+ require 'protobuf/generators/base'
5
+
6
+ RSpec.describe ::Protobuf::Generators::Base do
7
+
8
+ subject { described_class.new(double) }
9
+
10
+ context 'namespaces' do
11
+ let(:descriptor) { double(:name => 'Baz') }
12
+ subject { described_class.new(descriptor, 0, :namespace => [:foo, :bar]) }
13
+ specify { expect(subject.type_namespace).to eq([:foo, :bar, 'Baz']) }
14
+ specify { expect(subject.fully_qualified_type_namespace).to eq('.foo.bar.Baz') }
15
+ end
16
+
17
+ describe '#run_once' do
18
+ it 'protects the block from being entered more than once' do
19
+ foo = 0
20
+ bar = 0
21
+
22
+ test_run_once = lambda do
23
+ bar += 1
24
+ subject.run_once(:foo_test) do
25
+ foo += 1
26
+ end
27
+ end
28
+
29
+ 10.times { test_run_once.call }
30
+ expect(foo).to eq(1)
31
+ expect(bar).to eq(10)
32
+ end
33
+
34
+ it 'always returns the same object' do
35
+ rv = subject.run_once(:foo_test) do
36
+ "foo bar"
37
+ end
38
+ expect(rv).to eq("foo bar")
39
+
40
+ rv = subject.run_once(:foo_test) do
41
+ "baz quux"
42
+ end
43
+ expect(rv).to eq("foo bar")
44
+ end
45
+ end
46
+
47
+ describe '#to_s' do
48
+ before do
49
+ class ToStringTest < ::Protobuf::Generators::Base
50
+ def compile
51
+ run_once(:compile) do
52
+ puts "this is a test"
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ subject { ToStringTest.new(double) }
59
+
60
+ it 'compiles and returns the contents' do
61
+ 10.times do
62
+ expect(subject.to_s).to eq("this is a test\n")
63
+ end
64
+ end
65
+ end
66
+
67
+ describe '#validate_tags' do
68
+ context 'when tags are duplicated' do
69
+ it 'fails with a GeneratorFatalError' do
70
+ expect(::Protobuf::CodeGenerator).to receive(:fatal).with(/FooBar object has duplicate tags\. Expected 3 tags, but got 4/)
71
+ described_class.validate_tags("FooBar", [1, 2, 2, 3])
72
+ end
73
+ end
74
+
75
+ context 'when tags are missing in the range' do
76
+ it 'prints a warning' do
77
+ expect(::Protobuf::CodeGenerator).to receive(:print_tag_warning_suppress)
78
+ expect(::Protobuf::CodeGenerator).to receive(:warn).with(/FooBar object should have 5 tags \(1\.\.5\), but found 4 tags/)
79
+ described_class.validate_tags("FooBar", [1, 2, 4, 5])
80
+ end
81
+ end
82
+ end
83
+
84
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ require 'protobuf/generators/enum_generator'
4
+
5
+ RSpec.describe ::Protobuf::Generators::EnumGenerator do
6
+
7
+ let(:values) do
8
+ [
9
+ { :name => 'FOO', :number => 1 },
10
+ { :name => 'BAR', :number => 2 },
11
+ { :name => 'BAZ', :number => 3 },
12
+ ]
13
+ end
14
+ let(:options) { nil }
15
+ let(:enum_fields) do
16
+ {
17
+ :name => 'TestEnum',
18
+ :value => values,
19
+ :options => options,
20
+ }
21
+ end
22
+
23
+ let(:enum) { ::Google::Protobuf::EnumDescriptorProto.new(enum_fields) }
24
+
25
+ subject { described_class.new(enum) }
26
+
27
+ describe '#compile' do
28
+ let(:compiled) do
29
+ <<-RUBY
30
+ class TestEnum < ::Protobuf::Enum
31
+ define :FOO, 1
32
+ define :BAR, 2
33
+ define :BAZ, 3
34
+ end
35
+
36
+ RUBY
37
+ end
38
+
39
+ it 'compiles the enum and its field values' do
40
+ subject.compile
41
+ expect(subject.to_s).to eq(compiled)
42
+ end
43
+
44
+ context 'when allow_alias option is set' do
45
+ let(:compiled) do
46
+ <<-RUBY
47
+ class TestEnum < ::Protobuf::Enum
48
+ set_option :allow_alias
49
+
50
+ define :FOO, 1
51
+ define :BAR, 2
52
+ define :BAZ, 3
53
+ end
54
+
55
+ RUBY
56
+ end
57
+
58
+ let(:options) { { :allow_alias => true } }
59
+
60
+ it 'sets the allow_alias option' do
61
+ subject.compile
62
+ expect(subject.to_s).to eq(compiled)
63
+ end
64
+ end
65
+ end
66
+
67
+ describe '#build_value' do
68
+ it 'returns a string identifying the given enum value' do
69
+ expect(subject.build_value(enum.value.first)).to eq("define :FOO, 1")
70
+ end
71
+ end
72
+
73
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ require 'protobuf/code_generator'
4
+ require 'protobuf/generators/extension_generator'
5
+
6
+ RSpec.describe ::Protobuf::Generators::ExtensionGenerator do
7
+
8
+ let(:field_descriptors) do
9
+ [
10
+ double('field descriptor 1', :to_s => " field 1\n"),
11
+ double('field descriptor 2', :to_s => " field 2\n"),
12
+ double('field descriptor 3', :to_s => " field 3\n"),
13
+ ]
14
+ end
15
+ let(:message_type) { 'FooBar' }
16
+
17
+ before do
18
+ expect(::Protobuf::Generators::FieldGenerator).to receive(:new).with(field_descriptors[0], 1).and_return(field_descriptors[0])
19
+ expect(::Protobuf::Generators::FieldGenerator).to receive(:new).with(field_descriptors[1], 1).and_return(field_descriptors[1])
20
+ expect(::Protobuf::Generators::FieldGenerator).to receive(:new).with(field_descriptors[2], 1).and_return(field_descriptors[2])
21
+ end
22
+
23
+ subject { described_class.new(message_type, field_descriptors, 0) }
24
+
25
+ describe '#compile' do
26
+ let(:compiled) do
27
+ 'class FooBar < ::Protobuf::Message
28
+ field 1
29
+ field 2
30
+ field 3
31
+ end
32
+
33
+ '
34
+ end
35
+
36
+ it 'compiles the a class with the extension fields' do
37
+ subject.compile
38
+ expect(subject.to_s).to eq(compiled)
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,102 @@
1
+ require 'spec_helper'
2
+
3
+ require 'protobuf/generators/field_generator'
4
+
5
+ RSpec.describe ::Protobuf::Generators::FieldGenerator do
6
+
7
+ let(:label_enum) { :LABEL_OPTIONAL }
8
+ let(:name) { 'foo_bar' }
9
+ let(:number) { 3 }
10
+ let(:type_enum) { :TYPE_STRING }
11
+ let(:type_name) { nil }
12
+ let(:default_value) { nil }
13
+ let(:extendee) { nil }
14
+ let(:field_options) { {} }
15
+
16
+ let(:field_fields) do
17
+ {
18
+ :label => label_enum,
19
+ :name => name,
20
+ :number => number,
21
+ :type => type_enum,
22
+ :type_name => type_name,
23
+ :default_value => default_value,
24
+ :extendee => extendee,
25
+ :options => field_options,
26
+ }
27
+ end
28
+
29
+ let(:field) { ::Google::Protobuf::FieldDescriptorProto.new(field_fields) }
30
+
31
+ describe '#compile' do
32
+ subject { described_class.new(field).to_s }
33
+
34
+ specify { expect(subject).to eq "optional :string, :foo_bar, 3\n" }
35
+
36
+ context 'when the type is another message' do
37
+ let(:type_enum) { :TYPE_MESSAGE }
38
+ let(:type_name) { '.foo.bar.Baz' }
39
+
40
+ specify { expect(subject).to eq "optional ::Foo::Bar::Baz, :foo_bar, 3\n" }
41
+ end
42
+
43
+ context 'when a default value is used' do
44
+ let(:type_enum) { :TYPE_INT32 }
45
+ let(:default_value) { '42' }
46
+ specify { expect(subject).to eq "optional :int32, :foo_bar, 3, :default => 42\n" }
47
+
48
+ context 'when type is an enum' do
49
+ let(:type_enum) { :TYPE_ENUM }
50
+ let(:type_name) { '.foo.bar.Baz' }
51
+ let(:default_value) { 'QUUX' }
52
+
53
+ specify { expect(subject).to eq "optional ::Foo::Bar::Baz, :foo_bar, 3, :default => ::Foo::Bar::Baz::QUUX\n" }
54
+ end
55
+
56
+ context 'when the type is a string' do
57
+ let(:type_enum) { :TYPE_STRING }
58
+ let(:default_value) { "a default \"string\"" }
59
+
60
+ specify { expect(subject).to eq "optional :string, :foo_bar, 3, :default => \"a default \"string\"\"\n" }
61
+ end
62
+
63
+ context 'when float or double field type' do
64
+ let(:type_enum) { :TYPE_DOUBLE }
65
+
66
+ context 'when the default value is "nan"' do
67
+ let(:default_value) { 'nan' }
68
+ specify { expect(subject).to match(/::Float::NAN/) }
69
+ end
70
+
71
+ context 'when the default value is "inf"' do
72
+ let(:default_value) { 'inf' }
73
+ specify { expect(subject).to match(/::Float::INFINITY/) }
74
+ end
75
+
76
+ context 'when the default value is "-inf"' do
77
+ let(:default_value) { '-inf' }
78
+ specify { expect(subject).to match(/-::Float::INFINITY/) }
79
+ end
80
+ end
81
+ end
82
+
83
+ context 'when the field is an extension' do
84
+ let(:extendee) { 'foo.bar.Baz' }
85
+
86
+ specify { expect(subject).to eq "optional :string, :foo_bar, 3, :extension => true\n" }
87
+ end
88
+
89
+ context 'when field is packed' do
90
+ let(:field_options) { { :packed => true } }
91
+
92
+ specify { expect(subject).to eq "optional :string, :foo_bar, 3, :packed => true\n" }
93
+ end
94
+
95
+ context 'when field is deprecated' do
96
+ let(:field_options) { { :deprecated => true } }
97
+
98
+ specify { expect(subject).to eq "optional :string, :foo_bar, 3, :deprecated => true\n" }
99
+ end
100
+ end
101
+
102
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ require 'protobuf/generators/file_generator'
4
+
5
+ RSpec.describe ::Protobuf::Generators::FileGenerator do
6
+
7
+ let(:base_descriptor_fields) { { :name => 'test/foo.proto' } }
8
+ let(:descriptor_fields) { base_descriptor_fields }
9
+ let(:file_descriptor) { ::Google::Protobuf::FileDescriptorProto.new(descriptor_fields) }
10
+
11
+ subject { described_class.new(file_descriptor) }
12
+ specify { expect(subject.file_name).to eq('test/foo.pb.rb') }
13
+
14
+ describe '#print_import_requires' do
15
+ let(:descriptor_fields) do
16
+ base_descriptor_fields.merge(
17
+ :dependency => [
18
+ 'test/bar.proto',
19
+ 'test/baz.proto',
20
+ ],
21
+ )
22
+ end
23
+
24
+ it 'prints a ruby require for each dependency' do
25
+ expect(subject).to receive(:print_require).with('test/bar.pb')
26
+ expect(subject).to receive(:print_require).with('test/baz.pb')
27
+ subject.print_import_requires
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ require 'protobuf/generators/service_generator'
4
+
5
+ RSpec.describe ::Protobuf::Generators::ServiceGenerator do
6
+
7
+ let(:methods) do
8
+ [
9
+ { :name => 'Search', :input_type => 'FooRequest', :output_type => 'FooResponse' },
10
+ { :name => 'FooBar', :input_type => '.foo.Request', :output_type => '.bar.Response' },
11
+ ]
12
+ end
13
+ let(:service_fields) do
14
+ {
15
+ :name => 'TestService',
16
+ :method => methods,
17
+ }
18
+ end
19
+
20
+ let(:service) { ::Google::Protobuf::ServiceDescriptorProto.new(service_fields) }
21
+
22
+ subject { described_class.new(service) }
23
+
24
+ describe '#compile' do
25
+ let(:compiled) do
26
+ 'class TestService < ::Protobuf::Rpc::Service
27
+ rpc :search, FooRequest, FooResponse
28
+ rpc :foo_bar, ::Foo::Request, ::Bar::Response
29
+ end
30
+
31
+ '
32
+ end
33
+
34
+ it 'compiles the service and it\'s rpc methods' do
35
+ subject.compile
36
+ expect(subject.to_s).to eq(compiled)
37
+ end
38
+ end
39
+
40
+ describe '#build_method' do
41
+ it 'returns a string identifying the given method descriptor' do
42
+ expect(subject.build_method(service.method.first)).to eq("rpc :search, FooRequest, FooResponse")
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+ require 'protobuf/lifecycle'
3
+
4
+ RSpec.describe ::Protobuf::Lifecycle do
5
+ subject { described_class }
6
+
7
+ around do |example|
8
+ # this entire class is deprecated
9
+ ::Protobuf.deprecator.silence(&example)
10
+ end
11
+
12
+ before do
13
+ ::ActiveSupport::Notifications.notifier = ::ActiveSupport::Notifications::Fanout.new
14
+ end
15
+
16
+ it "registers a string as the event_name" do
17
+ expect(::ActiveSupport::Notifications).to receive(:subscribe).with("something")
18
+ subject.register("something") { true }
19
+ end
20
+
21
+ it "only registers blocks for event callbacks" do
22
+ expect do
23
+ subject.register("something")
24
+ end.to raise_error(/block/)
25
+ end
26
+
27
+ it "calls the registered block when triggered" do
28
+ this = nil
29
+ subject.register("this") do
30
+ this = "not nil"
31
+ end
32
+
33
+ subject.trigger("this")
34
+ expect(this).to_not be_nil
35
+ expect(this).to eq("not nil")
36
+ end
37
+
38
+ it "calls multiple registered blocks when triggered" do
39
+ this = nil
40
+ that = nil
41
+
42
+ subject.register("this") do
43
+ this = "not nil"
44
+ end
45
+
46
+ subject.register("this") do
47
+ that = "not nil"
48
+ end
49
+
50
+ subject.trigger("this")
51
+ expect(this).to_not be_nil
52
+ expect(this).to eq("not nil")
53
+ expect(that).to_not be_nil
54
+ expect(that).to eq("not nil")
55
+ end
56
+
57
+ context 'when the registered block has arity' do
58
+ context 'and the triggered event does not have args' do
59
+ it 'does not pass the args' do
60
+ outer_bar = nil
61
+
62
+ subject.register('foo') do |bar|
63
+ expect(bar).to be_nil
64
+ outer_bar = 'triggered'
65
+ end
66
+
67
+ subject.trigger('foo')
68
+ expect(outer_bar).to eq 'triggered'
69
+ end
70
+ end
71
+
72
+ context 'and the triggered event has arguments' do
73
+ it 'does not pass the args' do
74
+ outer_bar = nil
75
+
76
+ subject.register('foo') do |bar|
77
+ expect(bar).to_not be_nil
78
+ outer_bar = bar
79
+ end
80
+
81
+ subject.trigger('foo', 'baz')
82
+ expect(outer_bar).to eq 'baz'
83
+ end
84
+ end
85
+ end
86
+
87
+ context "normalized event names" do
88
+ specify { expect(subject.normalized_event_name(:derp)).to eq("derp") }
89
+ specify { expect(subject.normalized_event_name(:Derp)).to eq("derp") }
90
+ specify { expect(subject.normalized_event_name("DERP")).to eq("derp") }
91
+ specify { expect(subject.normalized_event_name("derp")).to eq("derp") }
92
+ end
93
+
94
+ end