protobuf 3.7.0.pre2 → 3.7.0.pre3

Sign up to get free protection for your applications and to get access to all the features.
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