protobuf 3.7.0.pre0 → 3.7.0.pre1
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/.rubocop.yml +6 -0
- data/CHANGES.md +6 -0
- data/bin/protoc-gen-ruby +6 -0
- data/lib/protobuf.rb +17 -0
- data/lib/protobuf/decoder.rb +0 -3
- data/lib/protobuf/enum.rb +1 -3
- data/lib/protobuf/field/base_field.rb +2 -5
- data/lib/protobuf/generators/file_generator.rb +9 -1
- data/lib/protobuf/message.rb +31 -26
- data/lib/protobuf/optionable.rb +53 -6
- data/lib/protobuf/rpc/service.rb +2 -2
- data/lib/protobuf/varint.rb +0 -2
- data/lib/protobuf/version.rb +1 -1
- data/protobuf.gemspec +2 -1
- data/spec/lib/protobuf/enum_spec.rb +4 -4
- data/spec/lib/protobuf/generators/file_generator_spec.rb +33 -0
- data/spec/lib/protobuf/message_spec.rb +21 -0
- data/spec/lib/protobuf/optionable_spec.rb +149 -26
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +2 -2
- data/spec/support/protos/enum.pb.rb +2 -1
- data/spec/support/protos/google_unittest.pb.rb +2 -1
- data/spec/support/protos/google_unittest_import.pb.rb +2 -1
- data/spec/support/protos/google_unittest_import_public.pb.rb +2 -1
- data/spec/support/protos/multi_field_extensions.pb.rb +2 -1
- data/spec/support/protos/resource.pb.rb +2 -1
- data/spec/support/server.rb +1 -1
- metadata +19 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2572788305cda35ff4cc6fde499167d9658d080b
|
4
|
+
data.tar.gz: 941f6a8239dbc36d8bc3e299dd07f37986c0bc11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc704397840f6e029fdc8b7a7cff5cc659ab077998e0f688f1babcbd55473155bf626e953ef7d88fdf17192b38d26256d571284c0c7e028e047b4c59131b138f
|
7
|
+
data.tar.gz: 684348b64a203f308076e1c41f6c76d4442cf7d5edd529a68016139f1cec83a98e37a71c854254fa8edef41a9cf536672708bb8cfb3e0acc4f99ceff108a66d2
|
data/.rubocop.yml
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
inherit_from: .rubocop_todo.yml
|
2
2
|
|
3
|
+
AllCops:
|
4
|
+
DisplayCopNames: true
|
5
|
+
|
3
6
|
Lint/EndAlignment:
|
4
7
|
AlignWith: keyword
|
5
8
|
|
@@ -46,6 +49,9 @@ Style/IndentHash:
|
|
46
49
|
Style/Semicolon:
|
47
50
|
AllowAsExpressionSeparator: true
|
48
51
|
|
52
|
+
Style/SingleLineBlockParams:
|
53
|
+
Enabled: false
|
54
|
+
|
49
55
|
Style/TrailingBlankLines:
|
50
56
|
Exclude:
|
51
57
|
- '**/*.pb.rb'
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Stable (3.x)
|
2
2
|
|
3
|
+
3.7.0 (pre1)
|
4
|
+
-----------
|
5
|
+
- BUG: Revert to old behavior for setting repeated fields to nil
|
6
|
+
- BUG: Set binmode for protoc-gen-ruby STDIN and STDOUT to compile proto files on Windows
|
7
|
+
- Make all things Optionable and fix requires
|
8
|
+
|
3
9
|
3.7.0 (pre0)
|
4
10
|
-----------
|
5
11
|
- Add `PB_USE_RAW_RPC_NAMES` option to preserve raw RPC name (since #underscore can be lossy).
|
data/bin/protoc-gen-ruby
CHANGED
@@ -10,6 +10,12 @@ require 'protobuf'
|
|
10
10
|
require 'protobuf/descriptors'
|
11
11
|
require 'protobuf/code_generator'
|
12
12
|
|
13
|
+
# Ensure that no encoding conversions are done on STDIN and STDOUT since
|
14
|
+
# we are passing binary data back and forth. Otherwise these streams
|
15
|
+
# will be mangled on Windows.
|
16
|
+
STDIN.binmode
|
17
|
+
STDOUT.binmode
|
18
|
+
|
13
19
|
request_bytes = STDIN.read
|
14
20
|
code_generator = ::Protobuf::CodeGenerator.new(request_bytes)
|
15
21
|
response_bytes = code_generator.response_bytes
|
data/lib/protobuf.rb
CHANGED
@@ -9,7 +9,24 @@ require 'active_support/inflector'
|
|
9
9
|
require 'active_support/json'
|
10
10
|
require 'active_support/notifications'
|
11
11
|
|
12
|
+
# All top-level run time code requires, ordered by necessity
|
13
|
+
require 'protobuf/wire_type'
|
14
|
+
|
15
|
+
require 'protobuf/varint_pure'
|
16
|
+
require 'protobuf/varint'
|
17
|
+
|
18
|
+
require 'protobuf/exceptions'
|
12
19
|
require 'protobuf/deprecation'
|
20
|
+
require 'protobuf/logging'
|
21
|
+
|
22
|
+
require 'protobuf/encoder'
|
23
|
+
require 'protobuf/decoder'
|
24
|
+
|
25
|
+
require 'protobuf/optionable'
|
26
|
+
require 'protobuf/field'
|
27
|
+
require 'protobuf/enum'
|
28
|
+
require 'protobuf/message'
|
29
|
+
require 'protobuf/descriptors'
|
13
30
|
|
14
31
|
module Protobuf
|
15
32
|
|
data/lib/protobuf/decoder.rb
CHANGED
data/lib/protobuf/enum.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'delegate'
|
2
|
-
require 'protobuf/deprecation'
|
3
|
-
require 'protobuf/optionable'
|
4
2
|
|
5
3
|
##
|
6
4
|
# Adding extension to Numeric until
|
@@ -12,7 +10,7 @@ require 'protobuf/optionable'
|
|
12
10
|
module Protobuf
|
13
11
|
class Enum < SimpleDelegator
|
14
12
|
# Public: Allows setting Options on the Enum class.
|
15
|
-
|
13
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::EnumOptions }
|
16
14
|
|
17
15
|
def self.aliases_allowed?
|
18
16
|
get_option(:allow_alias)
|
@@ -1,12 +1,9 @@
|
|
1
|
-
require 'protobuf/deprecation'
|
2
1
|
require 'protobuf/field/field_array'
|
3
|
-
require 'protobuf/logging'
|
4
|
-
require 'protobuf/wire_type'
|
5
|
-
|
6
2
|
module Protobuf
|
7
3
|
module Field
|
8
4
|
class BaseField
|
9
5
|
include ::Protobuf::Logging
|
6
|
+
::Protobuf::Optionable.inject(self, false) { ::Google::Protobuf::FieldOptions }
|
10
7
|
|
11
8
|
##
|
12
9
|
# Constants
|
@@ -185,7 +182,7 @@ module Protobuf
|
|
185
182
|
|
186
183
|
message_class.class_eval do
|
187
184
|
define_method(simple_field_name) { self[fully_qualified_field_name] }
|
188
|
-
define_method("#{simple_field_name}=") { |v|
|
185
|
+
define_method("#{simple_field_name}=") { |v| set_field(fully_qualified_field_name, v, false) }
|
189
186
|
end
|
190
187
|
|
191
188
|
return unless deprecated?
|
@@ -29,6 +29,7 @@ module Protobuf
|
|
29
29
|
print_import_requires
|
30
30
|
|
31
31
|
print_package do
|
32
|
+
inject_optionable
|
32
33
|
group = GroupGenerator.new(current_indent)
|
33
34
|
group.add_enums(descriptor.enum_type, :namespace => [descriptor.package])
|
34
35
|
group.add_message_declarations(descriptor.message_type)
|
@@ -104,7 +105,7 @@ module Protobuf
|
|
104
105
|
end
|
105
106
|
|
106
107
|
def print_generic_requires
|
107
|
-
print_require("protobuf
|
108
|
+
print_require("protobuf")
|
108
109
|
print_require("protobuf/rpc/service") if descriptor.service.count > 0
|
109
110
|
puts
|
110
111
|
end
|
@@ -123,6 +124,9 @@ module Protobuf
|
|
123
124
|
|
124
125
|
def print_package(&block)
|
125
126
|
namespaces = descriptor.package.split('.')
|
127
|
+
if namespaces.empty? && ENV.key?('PB_ALLOW_DEFAULT_PACKAGE_NAME')
|
128
|
+
namespaces = [File.basename(descriptor.name).sub('.proto', '')]
|
129
|
+
end
|
126
130
|
namespaces.reverse.reduce(block) do |previous, namespace|
|
127
131
|
-> { print_module(namespace, &previous) }
|
128
132
|
end.call
|
@@ -138,6 +142,10 @@ module Protobuf
|
|
138
142
|
token[0] == '.'
|
139
143
|
end
|
140
144
|
|
145
|
+
def inject_optionable
|
146
|
+
return if descriptor.package.empty? && !ENV.key?('PB_ALLOW_DEFAULT_PACKAGE_NAME')
|
147
|
+
puts "::Protobuf::Optionable.inject(self) { ::Google::Protobuf::FileOptions }"
|
148
|
+
end
|
141
149
|
end
|
142
150
|
end
|
143
151
|
end
|
data/lib/protobuf/message.rb
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
require 'protobuf/field'
|
2
|
-
require 'protobuf/deprecation'
|
3
|
-
require 'protobuf/enum'
|
4
|
-
require 'protobuf/exceptions'
|
5
1
|
require 'protobuf/message/fields'
|
6
2
|
require 'protobuf/message/serialization'
|
7
3
|
|
@@ -25,6 +21,7 @@ module Protobuf
|
|
25
21
|
|
26
22
|
extend ::Protobuf::Message::Fields
|
27
23
|
include ::Protobuf::Message::Serialization
|
24
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::MessageOptions }
|
28
25
|
|
29
26
|
##
|
30
27
|
# Class Methods
|
@@ -41,7 +38,7 @@ module Protobuf
|
|
41
38
|
def initialize(fields = {})
|
42
39
|
@values = {}
|
43
40
|
fields.to_hash.each do |name, value|
|
44
|
-
|
41
|
+
set_field(name, value, true)
|
45
42
|
end
|
46
43
|
|
47
44
|
yield self if block_given?
|
@@ -163,8 +160,37 @@ module Protobuf
|
|
163
160
|
end
|
164
161
|
|
165
162
|
def []=(name, value)
|
163
|
+
set_field(name, value, true)
|
164
|
+
end
|
165
|
+
|
166
|
+
##
|
167
|
+
# Instance Aliases
|
168
|
+
#
|
169
|
+
alias_method :to_hash_value, :to_hash
|
170
|
+
alias_method :to_proto_hash, :to_hash
|
171
|
+
alias_method :responds_to_has?, :respond_to_has?
|
172
|
+
alias_method :respond_to_and_has?, :respond_to_has?
|
173
|
+
alias_method :responds_to_and_has?, :respond_to_has?
|
174
|
+
alias_method :respond_to_has_present?, :respond_to_has_and_present?
|
175
|
+
alias_method :respond_to_and_has_present?, :respond_to_has_and_present?
|
176
|
+
alias_method :respond_to_and_has_and_present?, :respond_to_has_and_present?
|
177
|
+
alias_method :responds_to_has_present?, :respond_to_has_and_present?
|
178
|
+
alias_method :responds_to_and_has_present?, :respond_to_has_and_present?
|
179
|
+
alias_method :responds_to_and_has_and_present?, :respond_to_has_and_present?
|
180
|
+
|
181
|
+
##
|
182
|
+
# Private Instance Methods
|
183
|
+
#
|
184
|
+
|
185
|
+
private
|
186
|
+
|
187
|
+
def set_field(name, value, ignore_nil_for_repeated)
|
166
188
|
if (field = self.class.get_field(name, true))
|
167
189
|
if field.repeated?
|
190
|
+
if value.nil? && ignore_nil_for_repeated
|
191
|
+
::Protobuf.deprecator.deprecation_warning("#{self.class}#[#{name}]=nil", "use an empty array instead of nil")
|
192
|
+
return
|
193
|
+
end
|
168
194
|
if value.is_a?(Array)
|
169
195
|
value = value.compact
|
170
196
|
else
|
@@ -196,27 +222,6 @@ module Protobuf
|
|
196
222
|
end
|
197
223
|
end
|
198
224
|
|
199
|
-
##
|
200
|
-
# Instance Aliases
|
201
|
-
#
|
202
|
-
alias_method :to_hash_value, :to_hash
|
203
|
-
alias_method :to_proto_hash, :to_hash
|
204
|
-
alias_method :responds_to_has?, :respond_to_has?
|
205
|
-
alias_method :respond_to_and_has?, :respond_to_has?
|
206
|
-
alias_method :responds_to_and_has?, :respond_to_has?
|
207
|
-
alias_method :respond_to_has_present?, :respond_to_has_and_present?
|
208
|
-
alias_method :respond_to_and_has_present?, :respond_to_has_and_present?
|
209
|
-
alias_method :respond_to_and_has_and_present?, :respond_to_has_and_present?
|
210
|
-
alias_method :responds_to_has_present?, :respond_to_has_and_present?
|
211
|
-
alias_method :responds_to_and_has_present?, :respond_to_has_and_present?
|
212
|
-
alias_method :responds_to_and_has_and_present?, :respond_to_has_and_present?
|
213
|
-
|
214
|
-
##
|
215
|
-
# Private Instance Methods
|
216
|
-
#
|
217
|
-
|
218
|
-
private
|
219
|
-
|
220
225
|
def copy_to(object, method)
|
221
226
|
duplicate = proc do |obj|
|
222
227
|
case obj
|
data/lib/protobuf/optionable.rb
CHANGED
@@ -1,17 +1,36 @@
|
|
1
|
-
require 'active_support/concern'
|
2
|
-
|
3
1
|
module Protobuf
|
4
2
|
module Optionable
|
5
|
-
extend ::ActiveSupport::Concern
|
6
|
-
|
7
3
|
module ClassMethods
|
8
4
|
def get_option(name)
|
9
|
-
|
5
|
+
name = name.to_s
|
6
|
+
option = optionable_descriptor_class.get_field(name, true)
|
7
|
+
fail ArgumentError, "invalid option=#{name}" unless option
|
8
|
+
unless option.fully_qualified_name.to_s == name
|
9
|
+
# Eventually we'll deprecate the use of simple names of fields completely, but for now make sure people
|
10
|
+
# are accessing options correctly. We allow simple names in other places for backwards compatibility.
|
11
|
+
fail ArgumentError, "must access option using its fully qualified name: #{option.fully_qualified_name.inspect}"
|
12
|
+
end
|
13
|
+
if @_optionable_options.try(:key?, name)
|
14
|
+
value = @_optionable_options[name]
|
15
|
+
else
|
16
|
+
value = option.default_value
|
17
|
+
end
|
18
|
+
if option.type_class < ::Protobuf::Message
|
19
|
+
option.type_class.new(value)
|
20
|
+
else
|
21
|
+
value
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_option!(name)
|
26
|
+
get_option(name) if @_optionable_options.try(:key?, name.to_s)
|
10
27
|
end
|
11
28
|
|
29
|
+
private
|
30
|
+
|
12
31
|
def set_option(name, value = true)
|
13
32
|
@_optionable_options ||= {}
|
14
|
-
@_optionable_options[name] = value
|
33
|
+
@_optionable_options[name.to_s] = value
|
15
34
|
end
|
16
35
|
end
|
17
36
|
|
@@ -19,5 +38,33 @@ module Protobuf
|
|
19
38
|
self.class.get_option(name)
|
20
39
|
end
|
21
40
|
|
41
|
+
def get_option!(name)
|
42
|
+
self.class.get_option!(name)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.inject(base_class, extend_class = true, &block)
|
46
|
+
unless block_given?
|
47
|
+
fail ArgumentError, 'missing option class block (e.g: ::Google::Protobuf::MessageOptions)'
|
48
|
+
end
|
49
|
+
if extend_class
|
50
|
+
# Check if optionable_descriptor_class is already defined and short circuit if so.
|
51
|
+
# File options are injected per module, and since a module can be defined more than once,
|
52
|
+
# we will get a warning if we try to define optionable_descriptor_class twice.
|
53
|
+
if base_class.respond_to?(:optionable_descriptor_class)
|
54
|
+
if base_class.optionable_descriptor_class != block.call
|
55
|
+
fail 'A class is being defined with two different descriptor classes, something is very wrong'
|
56
|
+
else
|
57
|
+
return # Don't define optionable_descriptor_class twice
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
base_class.extend(ClassMethods)
|
62
|
+
base_class.__send__(:include, self)
|
63
|
+
base_class.define_singleton_method(:optionable_descriptor_class, block)
|
64
|
+
else
|
65
|
+
base_class.__send__(:include, ClassMethods)
|
66
|
+
base_class.module_eval { define_method(:optionable_descriptor_class, block) }
|
67
|
+
end
|
68
|
+
end
|
22
69
|
end
|
23
70
|
end
|
data/lib/protobuf/rpc/service.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
require 'active_support/core_ext/class'
|
2
|
-
|
3
1
|
require 'protobuf/logging'
|
2
|
+
require 'protobuf/message'
|
4
3
|
require 'protobuf/rpc/client'
|
5
4
|
require 'protobuf/rpc/error'
|
6
5
|
require 'protobuf/rpc/service_filters'
|
@@ -14,6 +13,7 @@ module Protobuf
|
|
14
13
|
class Service
|
15
14
|
include ::Protobuf::Logging
|
16
15
|
include ::Protobuf::Rpc::ServiceFilters
|
16
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::ServiceOptions }
|
17
17
|
|
18
18
|
DEFAULT_HOST = '127.0.0.1'.freeze
|
19
19
|
DEFAULT_PORT = 9399
|
data/lib/protobuf/varint.rb
CHANGED
data/lib/protobuf/version.rb
CHANGED
data/protobuf.gemspec
CHANGED
@@ -27,7 +27,8 @@ require "protobuf/version"
|
|
27
27
|
s.add_development_dependency 'ffi-rzmq'
|
28
28
|
s.add_development_dependency 'rake'
|
29
29
|
s.add_development_dependency 'rspec', '>= 3.0'
|
30
|
-
s.add_development_dependency
|
30
|
+
s.add_development_dependency "rubocop", "~> 0.35.0"
|
31
|
+
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
|
31
32
|
s.add_development_dependency 'simplecov'
|
32
33
|
s.add_development_dependency 'timecop'
|
33
34
|
s.add_development_dependency 'yard'
|
@@ -22,8 +22,8 @@ RSpec.describe Protobuf::Enum do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
describe '.aliases_allowed?' do
|
25
|
-
it 'is
|
26
|
-
expect(Test::EnumTestType.aliases_allowed?).to be
|
25
|
+
it 'is false when the option is not set' do
|
26
|
+
expect(Test::EnumTestType.aliases_allowed?).to be false
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -57,7 +57,7 @@ RSpec.describe Protobuf::Enum do
|
|
57
57
|
Test::EnumTestType::TWO,
|
58
58
|
Test::EnumTestType::MINUS_ONE,
|
59
59
|
Test::EnumTestType::THREE,
|
60
|
-
]
|
60
|
+
]
|
61
61
|
)
|
62
62
|
end
|
63
63
|
|
@@ -68,7 +68,7 @@ RSpec.describe Protobuf::Enum do
|
|
68
68
|
EnumAliasTest::FOO,
|
69
69
|
EnumAliasTest::BAR,
|
70
70
|
EnumAliasTest::BAZ,
|
71
|
-
]
|
71
|
+
]
|
72
72
|
)
|
73
73
|
end
|
74
74
|
end
|
@@ -29,4 +29,37 @@ RSpec.describe ::Protobuf::Generators::FileGenerator do
|
|
29
29
|
|
30
30
|
end
|
31
31
|
|
32
|
+
describe '#compile' do
|
33
|
+
it 'generates the file contents' do
|
34
|
+
subject.compile
|
35
|
+
expect(subject.to_s).to eq <<EOF
|
36
|
+
# encoding: utf-8
|
37
|
+
|
38
|
+
##
|
39
|
+
# This file is auto-generated. DO NOT EDIT!
|
40
|
+
#
|
41
|
+
require 'protobuf'
|
42
|
+
|
43
|
+
EOF
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'generates the file contents using default package name' do
|
47
|
+
allow(ENV).to receive(:key?).with('PB_ALLOW_DEFAULT_PACKAGE_NAME')
|
48
|
+
.and_return(true)
|
49
|
+
subject.compile
|
50
|
+
expect(subject.to_s).to eq <<EOF
|
51
|
+
# encoding: utf-8
|
52
|
+
|
53
|
+
##
|
54
|
+
# This file is auto-generated. DO NOT EDIT!
|
55
|
+
#
|
56
|
+
require 'protobuf'
|
57
|
+
|
58
|
+
module Foo
|
59
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::FileOptions }
|
60
|
+
end
|
61
|
+
|
62
|
+
EOF
|
63
|
+
end
|
64
|
+
end
|
32
65
|
end
|
@@ -181,6 +181,12 @@ RSpec.describe Protobuf::Message do
|
|
181
181
|
test_enum = Test::EnumTestMessage.new { |p| p.non_default_enum = 2 }
|
182
182
|
expect(test_enum.non_default_enum).to eq(2)
|
183
183
|
end
|
184
|
+
|
185
|
+
# to be deprecated
|
186
|
+
it "allows you to pass nil to repeated fields" do
|
187
|
+
test = Test::Resource.new(:repeated_enum => nil)
|
188
|
+
expect(test.repeated_enum).to eq([])
|
189
|
+
end
|
184
190
|
end
|
185
191
|
|
186
192
|
describe '#encode' do
|
@@ -444,6 +450,10 @@ RSpec.describe Protobuf::Message do
|
|
444
450
|
expect { subject.name = 1 }.to raise_error(/name/)
|
445
451
|
end
|
446
452
|
|
453
|
+
it 'does not allow a repeated field is set to nil' do
|
454
|
+
expect { subject.repeated_enum = nil }.to raise_error(TypeError)
|
455
|
+
end
|
456
|
+
|
447
457
|
context '#{simple_field_name}!' do
|
448
458
|
it 'returns value of set field' do
|
449
459
|
expect(::Test::Resource.new(:name => "Joe").name!).to eq("Joe")
|
@@ -723,6 +733,17 @@ RSpec.describe Protobuf::Message do
|
|
723
733
|
instance[100] = true
|
724
734
|
expect(instance[:ext_is_searchable]).to eq(true)
|
725
735
|
end
|
736
|
+
|
737
|
+
# to be deprecated
|
738
|
+
it 'does nothing when sent an empty array' do
|
739
|
+
instance[:repeated_enum] = nil
|
740
|
+
expect(instance[:repeated_enum]).to eq([])
|
741
|
+
instance[:repeated_enum] = [1, 2]
|
742
|
+
expect(instance[:repeated_enum]).to eq([1, 2])
|
743
|
+
instance[:repeated_enum] = nil
|
744
|
+
# Yes this is very silly, but backwards compatible
|
745
|
+
expect(instance[:repeated_enum]).to eq([1, 2])
|
746
|
+
end
|
726
747
|
end
|
727
748
|
|
728
749
|
context 'throwing TypeError' do
|
@@ -1,46 +1,169 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'protobuf/optionable'
|
3
|
+
require 'protobuf/field/message_field'
|
3
4
|
|
4
5
|
RSpec.describe 'Optionable' do
|
6
|
+
describe '.{get,get!}_option' do
|
7
|
+
before do
|
8
|
+
stub_const("OptionableGetOptionTest", Class.new(::Protobuf::Message) do
|
9
|
+
set_option :deprecated, true
|
10
|
+
set_option :".package.message_field", :field => 33
|
5
11
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
12
|
+
optional :int32, :field, 1
|
13
|
+
end)
|
14
|
+
end
|
15
|
+
|
16
|
+
it '.get_option retrieves the option as a symbol' do
|
17
|
+
expect(OptionableGetOptionTest.get_option(:deprecated)).to be(true)
|
18
|
+
end
|
19
|
+
|
20
|
+
it '.get_option returns the default value for unset options' do
|
21
|
+
expect(OptionableGetOptionTest.get_option(:message_set_wire_format)).to be(false)
|
22
|
+
end
|
23
|
+
|
24
|
+
it '.get_option retrieves the option as a string' do
|
25
|
+
expect(OptionableGetOptionTest.get_option('deprecated')).to be(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
it '.get_option errors if the option does not exist' do
|
29
|
+
expect { OptionableGetOptionTest.get_option(:baz) }.to raise_error(ArgumentError)
|
30
|
+
end
|
31
|
+
|
32
|
+
it '.get_option errors if the option is not accessed by its fully qualified name' do
|
33
|
+
message_field = ::Protobuf::Field::MessageField.new(
|
34
|
+
OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, '.message_field', {})
|
35
|
+
allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
|
36
|
+
expect { OptionableGetOptionTest.get_option(message_field.name) }.to raise_error(ArgumentError)
|
37
|
+
end
|
38
|
+
|
39
|
+
it '.get_option can return an option representing a message' do
|
40
|
+
message_field = ::Protobuf::Field::MessageField.new(
|
41
|
+
OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, 'message_field', {})
|
42
|
+
allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
|
43
|
+
expect(OptionableGetOptionTest.get_option(message_field.fully_qualified_name)).to eq(OptionableGetOptionTest.new(:field => 33))
|
44
|
+
end
|
45
|
+
|
46
|
+
it '.get_option! retrieves explicitly an set option' do
|
47
|
+
expect(OptionableGetOptionTest.get_option!(:deprecated)).to be(true)
|
48
|
+
end
|
49
|
+
|
50
|
+
it '.get_option! returns nil for unset options' do
|
51
|
+
expect(OptionableGetOptionTest.get_option!(:message_set_wire_format)).to be(nil)
|
52
|
+
end
|
53
|
+
|
54
|
+
it '.get_option! errors if the option does not exist' do
|
55
|
+
expect { OptionableGetOptionTest.get_option(:baz) }.to raise_error(ArgumentError)
|
56
|
+
end
|
57
|
+
|
58
|
+
it '#get_option retrieves the option as a symbol' do
|
59
|
+
expect(OptionableGetOptionTest.new.get_option(:deprecated)).to be(true)
|
60
|
+
end
|
61
|
+
|
62
|
+
it '#get_option returns the default value for unset options' do
|
63
|
+
expect(OptionableGetOptionTest.new.get_option(:message_set_wire_format)).to be(false)
|
11
64
|
end
|
12
65
|
|
13
|
-
it '
|
14
|
-
expect(
|
15
|
-
expect(OptionableSetOptionTest.method(:set_option).arity).to eq(-2)
|
16
|
-
expect do
|
17
|
-
OptionableSetOptionTest.set_option(:foo, :bar)
|
18
|
-
end.to_not raise_error
|
66
|
+
it '#get_option retrieves the option as a string' do
|
67
|
+
expect(OptionableGetOptionTest.new.get_option('deprecated')).to be(true)
|
19
68
|
end
|
20
69
|
|
21
|
-
it '
|
22
|
-
|
23
|
-
|
70
|
+
it '#get_option errors if the option is not accessed by its fully qualified name' do
|
71
|
+
message_field = ::Protobuf::Field::MessageField.new(
|
72
|
+
OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, 'message_field', {})
|
73
|
+
allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
|
74
|
+
expect { OptionableGetOptionTest.new.get_option(message_field.name) }.to raise_error(ArgumentError)
|
75
|
+
end
|
76
|
+
|
77
|
+
it '#get_option can return an option representing a message' do
|
78
|
+
message_field = ::Protobuf::Field::MessageField.new(
|
79
|
+
OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, 'message_field', {})
|
80
|
+
allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
|
81
|
+
expect(OptionableGetOptionTest.new.get_option(message_field.fully_qualified_name)).to eq(OptionableGetOptionTest.new(:field => 33))
|
82
|
+
end
|
83
|
+
|
84
|
+
it '#get_option errors if the option does not exist' do
|
85
|
+
expect { OptionableGetOptionTest.new.get_option(:baz) }.to raise_error(ArgumentError)
|
86
|
+
end
|
87
|
+
|
88
|
+
it '#get_option! retrieves explicitly an set option' do
|
89
|
+
expect(OptionableGetOptionTest.new.get_option!(:deprecated)).to be(true)
|
90
|
+
end
|
91
|
+
|
92
|
+
it '#get_option! returns nil for unset options' do
|
93
|
+
expect(OptionableGetOptionTest.new.get_option!(:message_set_wire_format)).to be(nil)
|
94
|
+
end
|
95
|
+
|
96
|
+
it '#get_option! errors if the option does not exist' do
|
97
|
+
expect { OptionableGetOptionTest.new.get_option(:baz) }.to raise_error(ArgumentError)
|
24
98
|
end
|
25
99
|
end
|
26
100
|
|
27
|
-
describe '.
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
101
|
+
describe '.inject' do
|
102
|
+
let(:klass) { Class.new }
|
103
|
+
|
104
|
+
it 'adds klass.{set,get}_option' do
|
105
|
+
expect { klass.get_option(:deprecated) }.to raise_error(NoMethodError)
|
106
|
+
expect { klass.__send__(:set_option, :deprecated, true) }.to raise_error(NoMethodError)
|
107
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
108
|
+
expect(klass.get_option(:deprecated)).to eq(false)
|
109
|
+
expect { klass.set_option(:deprecated, true) }.to raise_error(NoMethodError)
|
110
|
+
klass.__send__(:set_option, :deprecated, true)
|
111
|
+
expect(klass.get_option(:deprecated)).to eq(true)
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'adds klass#get_option' do
|
115
|
+
expect { klass.new.get_option(:deprecated) }.to raise_error(NoMethodError)
|
116
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
117
|
+
expect(klass.new.get_option(:deprecated)).to eq(false)
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'adds klass.optionable_descriptor_class' do
|
121
|
+
expect { klass.optionable_descriptor_class }.to raise_error(NoMethodError)
|
122
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
123
|
+
expect(klass.optionable_descriptor_class).to eq(::Google::Protobuf::MessageOptions)
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'does not add klass.optionable_descriptor_class twice' do
|
127
|
+
expect(klass).to receive(:define_singleton_method).once
|
128
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
129
|
+
klass.instance_eval do
|
130
|
+
def optionable_descriptor_class
|
131
|
+
::Google::Protobuf::MessageOptions
|
132
|
+
end
|
32
133
|
end
|
134
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
33
135
|
end
|
34
136
|
|
35
|
-
it '
|
36
|
-
|
37
|
-
expect
|
137
|
+
it 'throws error when klass.optionable_descriptor_class defined twice with different args' do
|
138
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
139
|
+
expect { ::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::FileOptions } }
|
140
|
+
.to raise_error('A class is being defined with two different descriptor classes, something is very wrong')
|
38
141
|
end
|
39
142
|
|
40
|
-
|
41
|
-
|
42
|
-
|
143
|
+
context 'extend_class = false' do
|
144
|
+
let(:object) { klass.new }
|
145
|
+
it 'adds object.{get,set}_option' do
|
146
|
+
expect { object.get_option(:deprecated) }.to raise_error(NoMethodError)
|
147
|
+
expect { object.__send__(:set_option, :deprecated, true) }.to raise_error(NoMethodError)
|
148
|
+
::Protobuf::Optionable.inject(klass, false) { ::Google::Protobuf::MessageOptions }
|
149
|
+
expect(object.get_option(:deprecated)).to eq(false)
|
150
|
+
expect { object.set_option(:deprecated, true) }.to raise_error(NoMethodError)
|
151
|
+
object.__send__(:set_option, :deprecated, true)
|
152
|
+
expect(object.get_option(:deprecated)).to eq(true)
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'does not add klass.{get,set}_option' do
|
156
|
+
expect { object.get_option(:deprecated) }.to raise_error(NoMethodError)
|
157
|
+
::Protobuf::Optionable.inject(klass, false) { ::Google::Protobuf::MessageOptions }
|
158
|
+
expect { klass.get_option(:deprecated) }.to raise_error(NoMethodError)
|
159
|
+
expect { klass.__send__(:set_option, :deprecated) }.to raise_error(NoMethodError)
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'creates an instance method optionable_descriptor_class' do
|
163
|
+
expect { object.optionable_descriptor_class }.to raise_error(NoMethodError)
|
164
|
+
::Protobuf::Optionable.inject(klass, false) { ::Google::Protobuf::MessageOptions }
|
165
|
+
expect(object.optionable_descriptor_class).to eq(::Google::Protobuf::MessageOptions)
|
166
|
+
end
|
43
167
|
end
|
44
168
|
end
|
45
|
-
|
46
169
|
end
|
@@ -362,7 +362,7 @@ RSpec.describe Protobuf::Rpc::ServiceFilters do
|
|
362
362
|
:endpoint,
|
363
363
|
:inner_around_bottom,
|
364
364
|
:outer_around_bottom,
|
365
|
-
]
|
365
|
+
]
|
366
366
|
)
|
367
367
|
end
|
368
368
|
|
@@ -390,7 +390,7 @@ RSpec.describe Protobuf::Rpc::ServiceFilters do
|
|
390
390
|
:outer_around_top,
|
391
391
|
:inner_around,
|
392
392
|
:outer_around_bottom,
|
393
|
-
]
|
393
|
+
]
|
394
394
|
)
|
395
395
|
end
|
396
396
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
##
|
4
4
|
# This file is auto-generated. DO NOT EDIT!
|
5
5
|
#
|
6
|
-
require 'protobuf
|
6
|
+
require 'protobuf'
|
7
7
|
|
8
8
|
|
9
9
|
##
|
@@ -12,6 +12,7 @@ require 'protobuf/message'
|
|
12
12
|
require 'protos/resource.pb'
|
13
13
|
|
14
14
|
module Test
|
15
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::FileOptions }
|
15
16
|
|
16
17
|
##
|
17
18
|
# Enum Classes
|
@@ -3,7 +3,7 @@
|
|
3
3
|
##
|
4
4
|
# This file is auto-generated. DO NOT EDIT!
|
5
5
|
#
|
6
|
-
require 'protobuf
|
6
|
+
require 'protobuf'
|
7
7
|
require 'protobuf/rpc/service'
|
8
8
|
|
9
9
|
|
@@ -13,6 +13,7 @@ require 'protobuf/rpc/service'
|
|
13
13
|
require 'protos/google_unittest_import.pb'
|
14
14
|
|
15
15
|
module Protobuf_unittest
|
16
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::FileOptions }
|
16
17
|
|
17
18
|
##
|
18
19
|
# Enum Classes
|
@@ -3,7 +3,7 @@
|
|
3
3
|
##
|
4
4
|
# This file is auto-generated. DO NOT EDIT!
|
5
5
|
#
|
6
|
-
require 'protobuf
|
6
|
+
require 'protobuf'
|
7
7
|
|
8
8
|
|
9
9
|
##
|
@@ -12,6 +12,7 @@ require 'protobuf/message'
|
|
12
12
|
require 'protos/google_unittest_import_public.pb'
|
13
13
|
|
14
14
|
module Protobuf_unittest_import
|
15
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::FileOptions }
|
15
16
|
|
16
17
|
##
|
17
18
|
# Enum Classes
|
@@ -3,10 +3,11 @@
|
|
3
3
|
##
|
4
4
|
# This file is auto-generated. DO NOT EDIT!
|
5
5
|
#
|
6
|
-
require 'protobuf
|
6
|
+
require 'protobuf'
|
7
7
|
require 'protobuf/rpc/service'
|
8
8
|
|
9
9
|
module Test
|
10
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::FileOptions }
|
10
11
|
|
11
12
|
##
|
12
13
|
# Enum Classes
|
data/spec/support/server.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protobuf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.7.0.
|
4
|
+
version: 3.7.0.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- BJ Neilsen
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2016-
|
14
|
+
date: 2016-05-17 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activesupport
|
@@ -113,18 +113,32 @@ dependencies:
|
|
113
113
|
version: '3.0'
|
114
114
|
- !ruby/object:Gem::Dependency
|
115
115
|
name: rubocop
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - "~>"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 0.35.0
|
121
|
+
type: :development
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - "~>"
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: 0.35.0
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
name: parser
|
116
130
|
requirement: !ruby/object:Gem::Requirement
|
117
131
|
requirements:
|
118
132
|
- - '='
|
119
133
|
- !ruby/object:Gem::Version
|
120
|
-
version: 0.
|
134
|
+
version: 2.3.0.6
|
121
135
|
type: :development
|
122
136
|
prerelease: false
|
123
137
|
version_requirements: !ruby/object:Gem::Requirement
|
124
138
|
requirements:
|
125
139
|
- - '='
|
126
140
|
- !ruby/object:Gem::Version
|
127
|
-
version: 0.
|
141
|
+
version: 2.3.0.6
|
128
142
|
- !ruby/object:Gem::Dependency
|
129
143
|
name: simplecov
|
130
144
|
requirement: !ruby/object:Gem::Requirement
|
@@ -437,7 +451,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
437
451
|
version: 1.3.1
|
438
452
|
requirements: []
|
439
453
|
rubyforge_project:
|
440
|
-
rubygems_version: 2.5
|
454
|
+
rubygems_version: 2.4.5
|
441
455
|
signing_key:
|
442
456
|
specification_version: 4
|
443
457
|
summary: Google Protocol Buffers serialization and RPC implementation for Ruby.
|