protobuf 3.7.0.pre2 → 3.7.0.pre3

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 (114) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -1
  3. data/.rubocop_todo.yml +7 -1
  4. data/.travis.yml +8 -1
  5. data/CHANGES.md +25 -1
  6. data/bin/protoc-gen-ruby +2 -2
  7. data/lib/protobuf/cli.rb +29 -17
  8. data/lib/protobuf/code_generator.rb +49 -1
  9. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +9 -1
  10. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +14 -1
  11. data/lib/protobuf/encoder.rb +2 -2
  12. data/lib/protobuf/enum.rb +3 -3
  13. data/lib/protobuf/field/base_field.rb +27 -19
  14. data/lib/protobuf/field/bool_field.rb +10 -8
  15. data/lib/protobuf/field/bytes_field.rb +14 -6
  16. data/lib/protobuf/field/float_field.rb +2 -0
  17. data/lib/protobuf/field/string_field.rb +10 -0
  18. data/lib/protobuf/field/varint_field.rb +12 -2
  19. data/lib/protobuf/generators/base.rb +29 -14
  20. data/lib/protobuf/generators/enum_generator.rb +4 -7
  21. data/lib/protobuf/generators/field_generator.rb +17 -4
  22. data/lib/protobuf/generators/file_generator.rb +121 -10
  23. data/lib/protobuf/generators/group_generator.rb +9 -3
  24. data/lib/protobuf/generators/message_generator.rb +8 -2
  25. data/lib/protobuf/generators/option_generator.rb +17 -0
  26. data/lib/protobuf/generators/printable.rb +2 -2
  27. data/lib/protobuf/generators/service_generator.rb +27 -3
  28. data/lib/protobuf/lifecycle.rb +1 -1
  29. data/lib/protobuf/message/fields.rb +13 -15
  30. data/lib/protobuf/message/serialization.rb +9 -9
  31. data/lib/protobuf/message.rb +23 -29
  32. data/lib/protobuf/optionable.rb +10 -10
  33. data/lib/protobuf/rpc/buffer.rb +7 -6
  34. data/lib/protobuf/rpc/client.rb +2 -30
  35. data/lib/protobuf/rpc/connectors/base.rb +168 -6
  36. data/lib/protobuf/rpc/connectors/ping.rb +2 -2
  37. data/lib/protobuf/rpc/connectors/socket.rb +6 -1
  38. data/lib/protobuf/rpc/connectors/zmq.rb +1 -2
  39. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +2 -1
  40. data/lib/protobuf/rpc/error.rb +2 -2
  41. data/lib/protobuf/rpc/middleware/exception_handler.rb +4 -0
  42. data/lib/protobuf/rpc/middleware/logger.rb +4 -0
  43. data/lib/protobuf/rpc/middleware/request_decoder.rb +11 -16
  44. data/lib/protobuf/rpc/middleware/response_encoder.rb +18 -23
  45. data/lib/protobuf/rpc/rpc.pb.rb +2 -1
  46. data/lib/protobuf/rpc/rpc_method.rb +16 -0
  47. data/lib/protobuf/rpc/servers/socket/server.rb +4 -4
  48. data/lib/protobuf/rpc/servers/socket_runner.rb +8 -0
  49. data/lib/protobuf/rpc/servers/zmq/broker.rb +7 -6
  50. data/lib/protobuf/rpc/servers/zmq/server.rb +8 -7
  51. data/lib/protobuf/rpc/servers/zmq/util.rb +6 -6
  52. data/lib/protobuf/rpc/servers/zmq/worker.rb +7 -6
  53. data/lib/protobuf/rpc/servers/zmq_runner.rb +8 -0
  54. data/lib/protobuf/rpc/service.rb +6 -15
  55. data/lib/protobuf/rpc/service_directory.rb +1 -1
  56. data/lib/protobuf/rpc/service_dispatcher.rb +5 -6
  57. data/lib/protobuf/rpc/service_filters.rb +8 -30
  58. data/lib/protobuf/socket.rb +2 -2
  59. data/lib/protobuf/version.rb +1 -1
  60. data/lib/protobuf/zmq.rb +2 -2
  61. data/lib/protobuf.rb +12 -27
  62. data/protobuf.gemspec +5 -3
  63. data/spec/benchmark/tasks.rb +1 -0
  64. data/spec/functional/code_generator_spec.rb +38 -0
  65. data/spec/lib/protobuf/cli_spec.rb +19 -10
  66. data/spec/lib/protobuf/code_generator_spec.rb +28 -0
  67. data/spec/lib/protobuf/enum_spec.rb +6 -2
  68. data/spec/lib/protobuf/field/bool_field_spec.rb +4 -0
  69. data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
  70. data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
  71. data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
  72. data/spec/lib/protobuf/field/float_field_spec.rb +5 -1
  73. data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
  74. data/spec/lib/protobuf/field/message_field_spec.rb +53 -0
  75. data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
  76. data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
  77. data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
  78. data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
  79. data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
  80. data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
  81. data/spec/lib/protobuf/generators/base_spec.rb +69 -1
  82. data/spec/lib/protobuf/generators/enum_generator_spec.rb +1 -1
  83. data/spec/lib/protobuf/generators/field_generator_spec.rb +58 -0
  84. data/spec/lib/protobuf/generators/file_generator_spec.rb +47 -0
  85. data/spec/lib/protobuf/generators/service_generator_spec.rb +58 -14
  86. data/spec/lib/protobuf/message_spec.rb +2 -2
  87. data/spec/lib/protobuf/optionable_spec.rb +96 -0
  88. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +151 -0
  89. data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +3 -3
  90. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +0 -2
  91. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +2 -2
  92. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +4 -4
  93. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +2 -2
  94. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +1 -18
  95. data/spec/lib/protobuf/rpc/service_filters_spec.rb +2 -2
  96. data/spec/lib/protobuf/varint_spec.rb +1 -1
  97. data/spec/lib/protobuf_spec.rb +13 -16
  98. data/spec/support/packed_field.rb +3 -2
  99. data/spec/support/protos/enum.pb.rb +2 -1
  100. data/spec/support/protos/enum.proto +1 -0
  101. data/spec/support/protos/google_unittest.pb.rb +69 -58
  102. data/spec/support/protos/google_unittest_custom_options.bin +0 -0
  103. data/spec/support/protos/google_unittest_custom_options.pb.rb +361 -0
  104. data/spec/support/protos/google_unittest_custom_options.proto +424 -0
  105. data/spec/support/protos/google_unittest_import.pb.rb +8 -0
  106. data/spec/support/protos/google_unittest_import_public.pb.rb +6 -0
  107. data/spec/support/protos/resource.pb.rb +54 -2
  108. data/spec/support/protos/resource.proto +42 -2
  109. data/spec/support/server.rb +1 -1
  110. metadata +39 -16
  111. data/lib/protobuf/rpc/connector.rb +0 -19
  112. data/lib/protobuf/rpc/connectors/common.rb +0 -176
  113. data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
  114. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
@@ -16,7 +16,7 @@ module Protobuf
16
16
  :broadcast_beacons => false,
17
17
  :broadcast_busy => false,
18
18
  :zmq_inproc => true,
19
- }
19
+ }.freeze
20
20
 
21
21
  attr_accessor :options, :workers
22
22
  attr_reader :zmq_context
@@ -117,7 +117,7 @@ module Protobuf
117
117
  def frontend_ip
118
118
  @frontend_ip ||= resolve_ip(options[:host])
119
119
  end
120
- alias_method :backend_ip, :frontend_ip
120
+ alias :backend_ip frontend_ip
121
121
 
122
122
  def frontend_port
123
123
  options[:port]
@@ -217,11 +217,12 @@ module Protobuf
217
217
  end
218
218
 
219
219
  def timeout
220
- if @timeout.nil?
221
- @timeout = 0
222
- else
223
- @timeout = [minimum_timeout, maintenance_timeout].max
224
- end
220
+ @timeout =
221
+ if @timeout.nil?
222
+ 0
223
+ else
224
+ [minimum_timeout, maintenance_timeout].max
225
+ end
225
226
  end
226
227
 
227
228
  def total_workers
@@ -4,12 +4,12 @@ module Protobuf
4
4
  module Rpc
5
5
  module Zmq
6
6
 
7
- ADDRESS_MATCH = /\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/.freeze
8
- WORKER_READY_MESSAGE = "\1"
9
- CHECK_AVAILABLE_MESSAGE = "\3"
10
- NO_WORKERS_AVAILABLE = "\4"
11
- WORKERS_AVAILABLE = "\5"
12
- EMPTY_STRING = ""
7
+ ADDRESS_MATCH = /\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/
8
+ WORKER_READY_MESSAGE = "\1".freeze
9
+ CHECK_AVAILABLE_MESSAGE = "\3".freeze
10
+ NO_WORKERS_AVAILABLE = "\4".freeze
11
+ WORKERS_AVAILABLE = "\5".freeze
12
+ EMPTY_STRING = "".freeze
13
13
 
14
14
  module Util
15
15
  include ::Protobuf::Logging
@@ -47,7 +47,7 @@ module Protobuf
47
47
  loop do
48
48
  rc = poller.poll(500)
49
49
 
50
- if rc == 0 && !running?
50
+ if rc == 0 && !running? # rubocop:disable Style/GuardClause
51
51
  break # The server was shutdown and no requests are pending
52
52
  elsif rc == -1
53
53
  break # Something went wrong
@@ -68,11 +68,12 @@ module Protobuf
68
68
  private
69
69
 
70
70
  def init_zmq_context
71
- if inproc?
72
- @zmq_context = @server.zmq_context
73
- else
74
- @zmq_context = ZMQ::Context.new
75
- end
71
+ @zmq_context =
72
+ if inproc?
73
+ @server.zmq_context
74
+ else
75
+ ZMQ::Context.new
76
+ end
76
77
  end
77
78
 
78
79
  def init_backend_socket
@@ -60,3 +60,11 @@ module Protobuf
60
60
  end
61
61
  end
62
62
  end
63
+
64
+ module Protobuf
65
+ module Rpc
66
+ module Servers # bad file namespacing
67
+ ZmqRunner = ::Protobuf::Rpc::ZmqRunner
68
+ end
69
+ end
70
+ end
@@ -2,13 +2,12 @@ require 'protobuf/logging'
2
2
  require 'protobuf/message'
3
3
  require 'protobuf/rpc/client'
4
4
  require 'protobuf/rpc/error'
5
+ require 'protobuf/rpc/rpc_method'
5
6
  require 'protobuf/rpc/service_filters'
6
7
 
7
8
  module Protobuf
8
9
  module Rpc
9
10
  # Object to encapsulate the request/response types for a given service method
10
- #
11
- RpcMethod = Struct.new("RpcMethod", :method, :request_type, :response_type)
12
11
 
13
12
  class Service
14
13
  include ::Protobuf::Logging
@@ -103,8 +102,8 @@ module Protobuf
103
102
  # This methods is only used by the generated service definitions
104
103
  # and not useful for user code.
105
104
  #
106
- def self.rpc(method, request_type, response_type)
107
- rpcs[method] = RpcMethod.new(method, request_type, response_type)
105
+ def self.rpc(method, request_type, response_type, &options_block)
106
+ rpcs[method] = RpcMethod.new(method, request_type, response_type, &options_block)
108
107
  end
109
108
 
110
109
  # Hash containing the set of methods defined via `rpc`.
@@ -119,16 +118,8 @@ module Protobuf
119
118
  rpcs.key?(name)
120
119
  end
121
120
 
122
- ##
123
- # Instance Methods
124
- #
125
- # Get a callable object that will be used by the dispatcher
126
- # to invoke the specified rpc method. Facilitates callback dispatch.
127
- # The returned lambda is expected to be called at a later time (which
128
- # is why we wrap the method call).
129
- #
130
- def callable_rpc_method(method_name)
131
- -> { run_filters(method_name) }
121
+ def call(method_name)
122
+ run_filters(method_name)
132
123
  end
133
124
 
134
125
  # Response object for this rpc cycle. Not assignable.
@@ -162,7 +153,7 @@ module Protobuf
162
153
  def respond_with(candidate)
163
154
  @response = candidate
164
155
  end
165
- alias_method :return_from_whence_you_came, :respond_with
156
+ alias :return_from_whence_you_came respond_with
166
157
 
167
158
  def response_type
168
159
  @response_type ||= env.response_type
@@ -21,7 +21,7 @@ module Protobuf
21
21
  include ::Singleton
22
22
  include ::Protobuf::Logging
23
23
 
24
- DEFAULT_ADDRESS = "0.0.0.0"
24
+ DEFAULT_ADDRESS = '0.0.0.0'.freeze
25
25
  DEFAULT_PORT = 53000
26
26
  DEFAULT_TIMEOUT = 1
27
27
 
@@ -12,6 +12,10 @@ module Protobuf
12
12
  end
13
13
 
14
14
  def call(env)
15
+ dup._call(env)
16
+ end
17
+
18
+ def _call(env)
15
19
  @env = env
16
20
 
17
21
  env.response = dispatch_rpc_request
@@ -24,13 +28,8 @@ module Protobuf
24
28
 
25
29
  private
26
30
 
27
- # Call the given service method.
28
31
  def dispatch_rpc_request
29
- unless rpc_service.respond_to?(method_name)
30
- fail MethodNotFound, "#{service_name}##{method_name} is not a publicly defined method."
31
- end
32
-
33
- rpc_service.callable_rpc_method(method_name).call
32
+ rpc_service.call(method_name)
34
33
  rpc_service.response
35
34
  end
36
35
 
@@ -120,15 +120,9 @@ module Protobuf
120
120
  # or an object that responds to `call`.
121
121
  #
122
122
  def invoke_via_if?(_rpc_method, filter)
123
- if_check = filter.fetch(:if) { ->(_service) { return true } }
124
- do_invoke = case
125
- when if_check.nil?
126
- true
127
- else
128
- call_or_send(if_check)
129
- end
130
-
131
- do_invoke
123
+ if_check = filter.fetch(:if, nil)
124
+ return true if if_check.nil?
125
+ call_or_send(if_check)
132
126
  end
133
127
 
134
128
  # If the target rpc endpoint method is listed in the :only option,
@@ -150,15 +144,9 @@ module Protobuf
150
144
  # or an object that responds to `call`.
151
145
  #
152
146
  def invoke_via_unless?(_rpc_method, filter)
153
- unless_check = filter.fetch(:unless) { ->(_service) { return false } }
154
- skip_invoke = case
155
- when unless_check.nil?
156
- false
157
- else
158
- call_or_send(unless_check)
159
- end
160
-
161
- !skip_invoke
147
+ unless_check = filter.fetch(:unless, nil)
148
+ return true if unless_check.nil?
149
+ !call_or_send(unless_check)
162
150
  end
163
151
 
164
152
  def rescue_filters
@@ -253,20 +241,10 @@ module Protobuf
253
241
  # __send__ assuming that we respond_to it. Return the call's return value.
254
242
  #
255
243
  def call_or_send(callable, *args, &block)
256
- return_value = case
257
- when callable.respond_to?(:call)
258
- callable.call(self, *args, &block)
259
- when respond_to?(callable, true)
260
- __send__(callable, *args, &block)
261
- else
262
- fail "Object #{callable} is not callable"
263
- end
264
-
265
- return_value
244
+ return callable.call(self, *args, &block) if callable.respond_to?(:call)
245
+ __send__(callable, *args, &block)
266
246
  end
267
-
268
247
  end
269
-
270
248
  end
271
249
  end
272
250
  end
@@ -15,7 +15,7 @@
15
15
  # gem 'protobuf', :require => 'protobuf/socket'
16
16
  #
17
17
  require 'protobuf'
18
- ::Protobuf.connector_type = :socket
19
-
20
18
  require 'protobuf/rpc/servers/socket/server'
21
19
  require 'protobuf/rpc/connectors/socket'
20
+
21
+ ::Protobuf.connector_type_class = ::Protobuf::Rpc::Connectors::Socket
@@ -1,3 +1,3 @@
1
1
  module Protobuf
2
- VERSION = '3.7.0.pre2'
2
+ VERSION = '3.7.0.pre3' # rubocop:disable Style/MutableConstant
3
3
  end
data/lib/protobuf/zmq.rb CHANGED
@@ -14,8 +14,8 @@
14
14
  # gem 'protobuf', :require => 'protobuf/zmq'
15
15
  #
16
16
  require 'protobuf'
17
- Protobuf.connector_type = :zmq
18
-
19
17
  require 'ffi-rzmq'
20
18
  require 'protobuf/rpc/servers/zmq/server'
21
19
  require 'protobuf/rpc/connectors/zmq'
20
+
21
+ Protobuf.connector_type_class = ::Protobuf::Rpc::Connectors::Zmq
data/lib/protobuf.rb CHANGED
@@ -30,12 +30,6 @@ require 'protobuf/descriptors'
30
30
 
31
31
  module Protobuf
32
32
 
33
- # See Protobuf#connector_type documentation.
34
- CONNECTORS = [:socket, :zmq].freeze
35
-
36
- # Default is Socket as it has no external dependencies.
37
- DEFAULT_CONNECTOR = :socket
38
-
39
33
  class << self
40
34
  # Client Host
41
35
  #
@@ -49,19 +43,12 @@ module Protobuf
49
43
  @client_host ||= Socket.gethostname
50
44
  end
51
45
 
52
- # Connector Type
53
- #
54
- # Default: socket
55
- #
56
- # Symbol value which denotes the type of connector to use
57
- # during client requests to an RPC server.
58
- def self.connector_type
59
- @connector_type ||= DEFAULT_CONNECTOR
46
+ def self.connector_type_class
47
+ @connector_type_class ||= ::Protobuf::Rpc::Connectors::Socket
60
48
  end
61
49
 
62
- def self.connector_type=(type)
63
- fail ArgumentError, 'Invalid connector type given' unless CONNECTORS.include?(type)
64
- @connector_type = type
50
+ def self.connector_type_class=(type_class)
51
+ @connector_type_class = type_class
65
52
  end
66
53
 
67
54
  # GC Pause during server requests
@@ -101,17 +88,15 @@ unless ENV.key?('PB_NO_NETWORKING')
101
88
  require 'protobuf/rpc/service'
102
89
 
103
90
  env_connector_type = ENV.fetch('PB_CLIENT_TYPE') do
104
- ::Protobuf::DEFAULT_CONNECTOR
105
- end.to_s.downcase.strip.to_sym
91
+ :socket
92
+ end
106
93
 
107
- if ::Protobuf::CONNECTORS.include?(env_connector_type)
108
- require "protobuf/#{env_connector_type}"
94
+ symbolized_connector_type = env_connector_type.to_s.downcase.strip.to_sym
95
+ if [:zmq, :socket].include?(symbolized_connector_type)
96
+ require "protobuf/#{symbolized_connector_type}"
109
97
  else
110
- $stderr.puts <<-WARN
111
- [WARNING] Require attempted on an invalid connector type '#{env_connector_type}'.
112
- Falling back to default '#{::Protobuf::DEFAULT_CONNECTOR}' connector.
113
- WARN
114
-
115
- require "protobuf/#{::Protobuf::DEFAULT_CONNECTOR}"
98
+ require "#{env_connector_type}" # rubocop:disable Style/UnneededInterpolation
99
+ classified = env_connector_type.classify
100
+ ::Protobuf.connector_type_class = classified.constantize
116
101
  end
117
102
  end
data/protobuf.gemspec CHANGED
@@ -19,15 +19,17 @@ require "protobuf/version"
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency 'activesupport', '>= 3.2'
22
+ # Hack, as Rails 5 requires Ruby version >= 2.2.2.
23
+ active_support_max_version = "< 5" if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.2.2")
24
+ s.add_dependency "activesupport", '>= 3.2', active_support_max_version
23
25
  s.add_dependency 'middleware'
24
26
  s.add_dependency 'thor'
25
27
  s.add_dependency 'thread_safe'
26
28
 
27
29
  s.add_development_dependency 'ffi-rzmq'
28
- s.add_development_dependency 'rake'
30
+ s.add_development_dependency 'rake', '< 11.0' # Rake 11.0.1 removes the last_comment method which rspec-core (< 3.4.4) uses
29
31
  s.add_development_dependency 'rspec', '>= 3.0'
30
- s.add_development_dependency "rubocop", "~> 0.35.0"
32
+ s.add_development_dependency "rubocop", "~> 0.38.0"
31
33
  s.add_development_dependency "parser", "2.3.0.6" # Locked this down since 2.3.0.7 causes issues. https://github.com/bbatsov/rubocop/pull/2984
32
34
  s.add_development_dependency 'simplecov'
33
35
  s.add_development_dependency 'timecop'
@@ -1,4 +1,5 @@
1
1
  require 'benchmark'
2
+ require 'protobuf'
2
3
  require 'protobuf/socket'
3
4
  require 'support/all'
4
5
  require 'spec_helper'
@@ -0,0 +1,38 @@
1
+ # encoding: binary
2
+
3
+ require 'spec_helper'
4
+ require 'protobuf/code_generator'
5
+
6
+ RSpec.describe 'code generation' do
7
+ it "generates code for google's unittest.proto" do
8
+ bytes = IO.read(PROTOS_PATH.join('google_unittest.bin'), :mode => 'rb')
9
+
10
+ expected_files =
11
+ ["google_unittest_import_public.pb.rb", "google_unittest_import.pb.rb", "google_unittest.pb.rb"]
12
+
13
+ expected_file_descriptors = expected_files.map do |file_name|
14
+ file_content = File.open(PROTOS_PATH.join(file_name), "r:UTF-8", &:read)
15
+ ::Google::Protobuf::Compiler::CodeGeneratorResponse::File.new(
16
+ :name => "protos/" + file_name, :content => file_content)
17
+ end
18
+
19
+ expected_output =
20
+ ::Google::Protobuf::Compiler::CodeGeneratorResponse.encode(:file => expected_file_descriptors)
21
+
22
+ code_generator = ::Protobuf::CodeGenerator.new(bytes)
23
+ code_generator.eval_unknown_extensions!
24
+ expect(code_generator.response_bytes).to eq(expected_output)
25
+ end
26
+
27
+ it "generates code (including service stubs) with custom field and method options" do
28
+ expected_unittest_custom_options =
29
+ File.open(PROTOS_PATH.join('google_unittest_custom_options.pb.rb'), "r:UTF-8", &:read)
30
+
31
+ bytes = IO.read(PROTOS_PATH.join('google_unittest_custom_options.bin'), :mode => 'rb')
32
+ code_generator = ::Protobuf::CodeGenerator.new(bytes)
33
+ code_generator.eval_unknown_extensions!
34
+ response = ::Google::Protobuf::Compiler::CodeGeneratorResponse.decode(code_generator.response_bytes)
35
+ expect(response.file.find { |f| f.name == 'protos/google_unittest_custom_options.pb.rb' }.content)
36
+ .to eq(expected_unittest_custom_options)
37
+ end
38
+ end
@@ -170,6 +170,25 @@ RSpec.describe ::Protobuf::CLI do
170
170
 
171
171
  context 'run modes' do
172
172
 
173
+ context "extension" do
174
+ let(:runner) { ::Protobuf::Rpc::Servers::SocketRunner }
175
+
176
+ it "loads the runner specified by PB_SERVER_TYPE" do
177
+ ENV['PB_SERVER_TYPE'] = "protobuf/rpc/servers/socket_runner"
178
+ expect(runner).to receive(:new).and_return(sock_runner)
179
+ described_class.start(args)
180
+ ENV.delete('PB_SERVER_TYPE')
181
+ end
182
+
183
+ context "without extension loaded" do
184
+ it "will throw a LoadError when extension is not loaded" do
185
+ ENV['PB_SERVER_TYPE'] = "socket_to_load"
186
+ expect { described_class.start(args) }.to raise_error(LoadError, /socket_to_load/)
187
+ ENV.delete("PB_SERVER_TYPE")
188
+ end
189
+ end
190
+ end
191
+
173
192
  context 'socket' do
174
193
  let(:test_args) { ['--socket'] }
175
194
  let(:runner) { ::Protobuf::Rpc::SocketRunner }
@@ -189,11 +208,6 @@ RSpec.describe ::Protobuf::CLI do
189
208
  described_class.start(args)
190
209
  ENV.delete('PB_SERVER_TYPE')
191
210
  end
192
-
193
- it 'configures the connector type to be socket' do
194
- load "protobuf/socket.rb"
195
- expect(::Protobuf.connector_type).to eq(:socket)
196
- end
197
211
  end
198
212
 
199
213
  context 'zmq workers only' do
@@ -259,11 +273,6 @@ RSpec.describe ::Protobuf::CLI do
259
273
  described_class.start(args)
260
274
  ENV.delete('PB_SERVER_TYPE')
261
275
  end
262
-
263
- it 'configures the connector type to be zmq' do
264
- load "protobuf/zmq.rb"
265
- expect(::Protobuf.connector_type).to eq(:zmq)
266
- end
267
276
  end
268
277
 
269
278
  end
@@ -37,6 +37,34 @@ RSpec.describe ::Protobuf::CodeGenerator do
37
37
  end
38
38
  end
39
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)
65
+ end
66
+ end
67
+
40
68
  context 'class-level printing methods' do
41
69
  describe '.fatal' do
42
70
  it 'raises a CodeGeneratorFatalError error' do
@@ -53,11 +53,12 @@ RSpec.describe Protobuf::Enum do
53
53
  it 'provides an array of defined Enums' do
54
54
  expect(Test::EnumTestType.enums).to eq(
55
55
  [
56
+ Test::EnumTestType::ZERO,
56
57
  Test::EnumTestType::ONE,
57
58
  Test::EnumTestType::TWO,
58
59
  Test::EnumTestType::MINUS_ONE,
59
60
  Test::EnumTestType::THREE,
60
- ]
61
+ ],
61
62
  )
62
63
  end
63
64
 
@@ -68,7 +69,7 @@ RSpec.describe Protobuf::Enum do
68
69
  EnumAliasTest::FOO,
69
70
  EnumAliasTest::BAR,
70
71
  EnumAliasTest::BAZ,
71
- ]
72
+ ],
72
73
  )
73
74
  end
74
75
  end
@@ -76,6 +77,7 @@ RSpec.describe Protobuf::Enum do
76
77
 
77
78
  describe '.enums_for_tag' do
78
79
  it 'returns an array of Enums for the given tag, if any' do
80
+ expect(EnumAliasTest.enums_for_tag(nil)).to eq([])
79
81
  expect(EnumAliasTest.enums_for_tag(1)).to eq([EnumAliasTest::FOO, EnumAliasTest::BAR])
80
82
  expect(EnumAliasTest.enums_for_tag(2)).to eq([EnumAliasTest::BAZ])
81
83
  expect(EnumAliasTest.enums_for_tag(3)).to eq([])
@@ -124,6 +126,7 @@ RSpec.describe Protobuf::Enum do
124
126
  it 'gets the Enum corresponding to the given tag' do
125
127
  expect(Test::EnumTestType.enum_for_tag(tag)).to eq(Test::EnumTestType.const_get(name))
126
128
  expect(Test::EnumTestType.enum_for_tag(-5)).to be_nil
129
+ expect(Test::EnumTestType.enum_for_tag(nil)).to be_nil
127
130
  end
128
131
  end
129
132
 
@@ -186,6 +189,7 @@ RSpec.describe Protobuf::Enum do
186
189
  it 'provides a hash of defined Enums' do
187
190
  expect(Test::EnumTestType.values).to eq(
188
191
  :MINUS_ONE => Test::EnumTestType::MINUS_ONE,
192
+ :ZERO => Test::EnumTestType::ZERO,
189
193
  :ONE => Test::EnumTestType::ONE,
190
194
  :TWO => Test::EnumTestType::TWO,
191
195
  :THREE => Test::EnumTestType::THREE,
@@ -2,6 +2,10 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe Protobuf::Field::BoolField do
4
4
 
5
+ it_behaves_like :packable_field, described_class do
6
+ let(:value) { [true, false] }
7
+ end
8
+
5
9
  class SomeBoolMessage < ::Protobuf::Message
6
10
  optional :bool, :some_bool, 1
7
11
  required :bool, :required_bool, 2
@@ -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,7 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Protobuf::Field::Fixed32Field do
4
+
5
+ it_behaves_like :packable_field, described_class
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Protobuf::Field::Fixed64Field do
4
+
5
+ it_behaves_like :packable_field, described_class
6
+
7
+ end
@@ -2,6 +2,10 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe Protobuf::Field::FloatField do
4
4
 
5
+ it_behaves_like :packable_field, described_class do
6
+ let(:value) { [1.0, 2.0, 3.0] }
7
+ end
8
+
5
9
  class SomeFloatMessage < ::Protobuf::Message
6
10
  optional :float, :some_float, 1
7
11
  end
@@ -39,7 +43,7 @@ RSpec.describe Protobuf::Field::FloatField do
39
43
  let(:value) { "aaaa" }
40
44
 
41
45
  it 'throws an error' do
42
- expect { subject }.to raise_error(ArgumentError)
46
+ expect { subject }.to raise_error(TypeError)
43
47
  end
44
48
  end
45
49
 
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Protobuf::Field::Int64Field do
4
+
5
+ it_behaves_like :packable_field, described_class
6
+
7
+ end