protip 0.10.7 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/definitions/google/protobuf/wrappers.proto +99 -0
- data/definitions/protip/messages/array.proto +3 -2
- data/definitions/protip/messages/errors.proto +5 -4
- data/definitions/protip/messages/types.proto +6 -4
- data/lib/google/protobuf/wrappers.rb +48 -0
- data/lib/protip/client.rb +3 -4
- data/lib/protip/error.rb +2 -3
- data/lib/protip/messages/array.rb +16 -0
- data/lib/protip/messages/errors.rb +22 -0
- data/lib/protip/messages/types.rb +18 -0
- data/lib/protip/resource.rb +11 -9
- data/lib/protip/standard_converter.rb +12 -41
- data/lib/protip/wrapper.rb +48 -26
- data/test/functional/protip/resource_test.rb +173 -138
- data/test/unit/protip/resource_test.rb +107 -85
- data/test/unit/protip/standard_converter_test.rb +14 -11
- data/test/unit/protip/wrapper_test.rb +105 -37
- metadata +12 -12
- data/definitions/protip/messages/wrappers.proto +0 -60
- data/lib/protip/messages/array.pb.rb +0 -27
- data/lib/protip/messages/errors.pb.rb +0 -34
- data/lib/protip/messages/types.pb.rb +0 -26
- data/lib/protip/messages/wrappers.pb.rb +0 -64
@@ -1,36 +1,39 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
+
require 'google/protobuf/wrappers'
|
3
4
|
require 'protip/standard_converter'
|
4
5
|
|
5
6
|
describe Protip::StandardConverter do
|
6
7
|
let(:converter) { Protip::StandardConverter.new }
|
7
8
|
|
8
9
|
let(:integer_types) do
|
9
|
-
[
|
10
|
+
[Google::Protobuf::Int64Value, Google::Protobuf::Int32Value, Google::Protobuf::UInt64Value, Google::Protobuf::UInt32Value]
|
10
11
|
end
|
11
12
|
|
12
13
|
let(:float_types) do
|
13
|
-
[
|
14
|
+
[Google::Protobuf::FloatValue, Google::Protobuf::DoubleValue]
|
14
15
|
end
|
15
16
|
|
16
17
|
let(:bool_types) do
|
17
|
-
[
|
18
|
+
[Google::Protobuf::BoolValue]
|
18
19
|
end
|
19
20
|
|
20
21
|
let(:string_types) do
|
21
|
-
[
|
22
|
+
[Google::Protobuf::StringValue, Google::Protobuf::BytesValue]
|
22
23
|
end
|
23
24
|
|
24
25
|
|
25
26
|
describe '#convertible?' do
|
26
27
|
it 'converts all standard types' do
|
27
|
-
(integer_types + float_types + string_types + bool_types + [Protip::Date]).each do |message_class|
|
28
|
-
assert converter.convertible?(message_class),
|
28
|
+
(integer_types + float_types + string_types + bool_types + [Protip::Messages::Date]).each do |message_class|
|
29
|
+
assert converter.convertible?(message_class), "expected type #{message_class.descriptor.name} not convertible"
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
33
|
it 'does not convert other message types' do
|
33
|
-
|
34
|
+
pool = Google::Protobuf::DescriptorPool.new
|
35
|
+
pool.build { add_message('test_message') { optional :id, :string, 1 } }
|
36
|
+
refute converter.convertible?(pool.lookup('test_message').msgclass)
|
34
37
|
end
|
35
38
|
end
|
36
39
|
|
@@ -49,9 +52,9 @@ describe Protip::StandardConverter do
|
|
49
52
|
end
|
50
53
|
|
51
54
|
it 'converts dates' do
|
52
|
-
date = converter.to_object(Protip::Date.new year: 2015, month: 2, day: 9)
|
53
|
-
assert_instance_of Date, date
|
54
|
-
assert_equal '
|
55
|
+
date = converter.to_object(::Protip::Messages::Date.new year: 2015, month: 2, day: 9)
|
56
|
+
assert_instance_of ::Date, date
|
57
|
+
assert_equal '2015-02-09', date.strftime
|
55
58
|
end
|
56
59
|
end
|
57
60
|
|
@@ -72,7 +75,7 @@ describe Protip::StandardConverter do
|
|
72
75
|
it 'converts dates' do
|
73
76
|
date = ::Date.new(2012, 5, 7)
|
74
77
|
assert_equal 7, date.day # Sanity check argument order
|
75
|
-
assert_equal Protip::Date.new(year: 2012, month: 5, day: 7), converter.to_message(date, Protip::Date)
|
78
|
+
assert_equal ::Protip::Messages::Date.new(year: 2012, month: 5, day: 7), converter.to_message(date, ::Protip::Messages::Date)
|
76
79
|
end
|
77
80
|
end
|
78
81
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
+
require 'google/protobuf'
|
4
|
+
require 'protip/converter'
|
3
5
|
require 'protip/wrapper'
|
4
6
|
|
5
7
|
module Protip::WrapperTest # namespace for internal constants
|
@@ -9,18 +11,35 @@ module Protip::WrapperTest # namespace for internal constants
|
|
9
11
|
include Protip::Converter
|
10
12
|
end.new
|
11
13
|
end
|
14
|
+
let :pool do
|
15
|
+
pool = Google::Protobuf::DescriptorPool.new
|
16
|
+
pool.build do
|
17
|
+
add_message 'inner_message' do
|
18
|
+
optional :value, :int64, 1
|
19
|
+
optional :note, :string, 2
|
20
|
+
end
|
21
|
+
|
22
|
+
add_message 'message' do
|
23
|
+
optional :inner, :message, 1, 'inner_message'
|
24
|
+
optional :string, :string, 2
|
12
25
|
|
13
|
-
|
14
|
-
|
15
|
-
|
26
|
+
repeated :inners, :message, 3, 'inner_message'
|
27
|
+
repeated :strings, :string, 4
|
28
|
+
|
29
|
+
optional :inner_blank, :message, 5, 'inner_message'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
pool
|
16
33
|
end
|
17
|
-
|
18
|
-
|
19
|
-
|
34
|
+
|
35
|
+
%w(inner_message message).each do |name|
|
36
|
+
let(:"#{name}_class") do
|
37
|
+
pool.lookup(name).msgclass
|
38
|
+
end
|
20
39
|
end
|
21
40
|
|
22
41
|
let(:wrapped_message) do
|
23
|
-
|
42
|
+
message_class.new(inner: inner_message_class.new(value: 25), string: 'test')
|
24
43
|
end
|
25
44
|
|
26
45
|
let(:wrapper) do
|
@@ -31,10 +50,12 @@ module Protip::WrapperTest # namespace for internal constants
|
|
31
50
|
it 'adds setters for message fields' do
|
32
51
|
assert_respond_to wrapper, :string=
|
33
52
|
assert_respond_to wrapper, :inner=
|
53
|
+
assert_respond_to wrapper, :inner_blank=
|
34
54
|
end
|
35
55
|
it 'adds getters for message fields' do
|
36
56
|
assert_respond_to wrapper, :string
|
37
57
|
assert_respond_to wrapper, :inner
|
58
|
+
assert_respond_to wrapper, :inner_blank
|
38
59
|
end
|
39
60
|
it 'responds to standard defined methods' do
|
40
61
|
assert_respond_to wrapper, :as_json
|
@@ -52,30 +73,38 @@ module Protip::WrapperTest # namespace for internal constants
|
|
52
73
|
end
|
53
74
|
end
|
54
75
|
|
76
|
+
it 'raises an error when building a repeated primitive field' do
|
77
|
+
assert_raises RuntimeError do
|
78
|
+
wrapper.build(:strings)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# TODO: How to add a new message to a repeated message field?
|
83
|
+
|
55
84
|
it 'raises an error when building a convertible message' do
|
56
|
-
converter.stubs(:convertible?).with(
|
85
|
+
converter.stubs(:convertible?).with(inner_message_class).returns(true)
|
57
86
|
assert_raises RuntimeError do
|
58
87
|
wrapper.build(:inner)
|
59
88
|
end
|
60
89
|
end
|
61
90
|
|
62
91
|
describe 'with an inconvertible message field' do
|
63
|
-
let(:wrapped_message) {
|
92
|
+
let(:wrapped_message) { message_class.new }
|
64
93
|
|
65
94
|
before do
|
66
|
-
converter.stubs(:convertible?).with(
|
95
|
+
converter.stubs(:convertible?).with(inner_message_class).returns(false)
|
67
96
|
end
|
68
97
|
|
69
98
|
it 'builds the message when no attributes are provided' do
|
70
99
|
assert_nil wrapped_message.inner # Sanity check
|
71
100
|
wrapper.build(:inner)
|
72
|
-
assert_equal
|
101
|
+
assert_equal inner_message_class.new, wrapped_message.inner
|
73
102
|
end
|
74
103
|
|
75
104
|
it 'overwrites the message if it exists' do
|
76
|
-
wrapped_message.inner =
|
105
|
+
wrapped_message.inner = inner_message_class.new(value: 4)
|
77
106
|
wrapper.build(:inner)
|
78
|
-
assert_equal
|
107
|
+
assert_equal inner_message_class.new, wrapped_message.inner
|
79
108
|
end
|
80
109
|
|
81
110
|
it 'delegates to #assign_attributes if attributes are provided' do
|
@@ -96,11 +125,28 @@ module Protip::WrapperTest # namespace for internal constants
|
|
96
125
|
assert_equal 'another thing', wrapped_message.string
|
97
126
|
end
|
98
127
|
|
99
|
-
it 'assigns
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
128
|
+
it 'assigns repeated primitive fields from an enumerator' do
|
129
|
+
wrapper.assign_attributes strings: ['one', 'two']
|
130
|
+
assert_equal ['one', 'two'], wrapped_message.strings
|
131
|
+
end
|
132
|
+
|
133
|
+
describe 'when assigning convertible message fields' do
|
134
|
+
before do
|
135
|
+
converter.stubs(:convertible?).with(inner_message_class).returns(true)
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'converts Ruby values to protobuf messages' do
|
139
|
+
converter.stubs(:convertible?).with(inner_message_class).returns(true)
|
140
|
+
converter.expects(:to_message).once.with(45, inner_message_class).returns(inner_message_class.new(value: 43))
|
141
|
+
wrapper.assign_attributes inner: 45
|
142
|
+
assert_equal inner_message_class.new(value: 43), wrapped_message.inner
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'allows messages to be assigned directly' do
|
146
|
+
message = inner_message_class.new
|
147
|
+
wrapper.assign_attributes inner: message
|
148
|
+
assert_same message, wrapper.message.inner
|
149
|
+
end
|
104
150
|
end
|
105
151
|
|
106
152
|
it 'returns nil' do
|
@@ -109,27 +155,35 @@ module Protip::WrapperTest # namespace for internal constants
|
|
109
155
|
|
110
156
|
describe 'when assigning inconvertible message fields' do
|
111
157
|
before do
|
112
|
-
converter.stubs(:convertible?).with(
|
158
|
+
converter.stubs(:convertible?).with(inner_message_class).returns(false)
|
113
159
|
end
|
114
160
|
|
115
161
|
it 'sets multiple attributes' do
|
116
162
|
wrapper.assign_attributes string: 'test2', inner: {value: 50}
|
117
163
|
assert_equal 'test2', wrapped_message.string
|
118
|
-
assert_equal
|
164
|
+
assert_equal inner_message_class.new(value: 50), wrapped_message.inner
|
119
165
|
end
|
120
166
|
|
121
167
|
it 'updates inconvertible message fields which have already been built' do
|
122
|
-
wrapped_message.inner =
|
168
|
+
wrapped_message.inner = inner_message_class.new(value: 60)
|
123
169
|
wrapper.assign_attributes inner: {note: 'updated'}
|
124
|
-
assert_equal
|
170
|
+
assert_equal inner_message_class.new(value: 60, note: 'updated'), wrapped_message.inner
|
125
171
|
end
|
126
172
|
|
127
|
-
it 'delegates to
|
173
|
+
it 'delegates to #assign_attributes on a nested wrapper when setting nested attributes on inconvertible message fields' do
|
128
174
|
inner = mock
|
129
|
-
|
175
|
+
field = wrapped_message.class.descriptor.detect{|f| f.name.to_sym == :inner}
|
176
|
+
raise 'unexpected' if !field
|
177
|
+
wrapper.stubs(:get).with(field).returns(inner)
|
130
178
|
inner.expects(:assign_attributes).once.with(value: 50, note: 'noted')
|
131
179
|
wrapper.assign_attributes inner: {value: 50, note: 'noted'}
|
132
180
|
end
|
181
|
+
|
182
|
+
it 'allows messages to be assigned directly' do
|
183
|
+
message = inner_message_class.new
|
184
|
+
wrapper.assign_attributes inner: message
|
185
|
+
assert_same message, wrapper.message.inner
|
186
|
+
end
|
133
187
|
end
|
134
188
|
end
|
135
189
|
|
@@ -140,9 +194,9 @@ module Protip::WrapperTest # namespace for internal constants
|
|
140
194
|
end
|
141
195
|
|
142
196
|
it 'returns false when messages are not equal' do
|
143
|
-
alternate_message =
|
144
|
-
refute_equal alternate_message,
|
145
|
-
refute_equal wrapper, Protip::Wrapper.new(alternate_message, converter)
|
197
|
+
alternate_message = message_class.new
|
198
|
+
refute_equal alternate_message, wrapper.message # Sanity check
|
199
|
+
refute_equal wrapper, Protip::Wrapper.new(alternate_message, wrapper.converter)
|
146
200
|
end
|
147
201
|
|
148
202
|
it 'returns false when converters are not equal' do
|
@@ -169,15 +223,21 @@ module Protip::WrapperTest # namespace for internal constants
|
|
169
223
|
end
|
170
224
|
|
171
225
|
it 'converts convertible messages' do
|
172
|
-
converter.expects(:convertible?).with(
|
173
|
-
converter.expects(:to_object).with(
|
226
|
+
converter.expects(:convertible?).with(inner_message_class).once.returns(true)
|
227
|
+
converter.expects(:to_object).once.with(inner_message_class.new(value: 25)).returns 40
|
174
228
|
assert_equal 40, wrapper.inner
|
175
229
|
end
|
176
230
|
|
177
231
|
it 'wraps inconvertible messages' do
|
178
|
-
converter.expects(:convertible?).with(
|
232
|
+
converter.expects(:convertible?).with(inner_message_class).once.returns(false)
|
179
233
|
converter.expects(:to_object).never
|
180
|
-
assert_equal Protip::Wrapper.new(
|
234
|
+
assert_equal Protip::Wrapper.new(inner_message_class.new(value: 25), converter), wrapper.inner
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'returns nil for messages that have not been set' do
|
238
|
+
converter.expects(:convertible?).never
|
239
|
+
converter.expects(:to_object).never
|
240
|
+
assert_equal nil, wrapper.inner_blank
|
181
241
|
end
|
182
242
|
end
|
183
243
|
|
@@ -191,15 +251,23 @@ module Protip::WrapperTest # namespace for internal constants
|
|
191
251
|
end
|
192
252
|
|
193
253
|
it 'converts convertible messages' do
|
194
|
-
converter.expects(:convertible?).with(
|
195
|
-
converter.expects(:to_message).with(40,
|
254
|
+
converter.expects(:convertible?).with(inner_message_class).once.returns(true)
|
255
|
+
converter.expects(:to_message).with(40, inner_message_class).returns(inner_message_class.new(value: 30))
|
196
256
|
|
197
257
|
wrapper.inner = 40
|
198
|
-
assert_equal
|
258
|
+
assert_equal inner_message_class.new(value: 30), wrapper.message.inner
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'removes message fields when assigning nil' do
|
262
|
+
converter.expects(:convertible?).never
|
263
|
+
converter.expects(:to_message).never
|
264
|
+
|
265
|
+
wrapper.inner = nil
|
266
|
+
assert_equal nil, wrapper.message.inner
|
199
267
|
end
|
200
268
|
|
201
269
|
it 'raises an error when setting inconvertible messages' do
|
202
|
-
converter.expects(:convertible?).with(
|
270
|
+
converter.expects(:convertible?).with(inner_message_class).once.returns(false)
|
203
271
|
converter.expects(:to_message).never
|
204
272
|
assert_raises ArgumentError do
|
205
273
|
wrapper.inner = 'cannot convert me'
|
@@ -210,8 +278,8 @@ module Protip::WrapperTest # namespace for internal constants
|
|
210
278
|
converter.expects(:convertible?).never
|
211
279
|
converter.expects(:to_message).never
|
212
280
|
|
213
|
-
wrapper.inner =
|
214
|
-
assert_equal
|
281
|
+
wrapper.inner = inner_message_class.new(value: 50)
|
282
|
+
assert_equal inner_message_class.new(value: 50), wrapper.message.inner
|
215
283
|
end
|
216
284
|
end
|
217
285
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AngelList
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -51,19 +51,19 @@ dependencies:
|
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '5.0'
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
|
-
name: protobuf
|
54
|
+
name: google-protobuf
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
|
-
- -
|
57
|
+
- - '='
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: 3.
|
59
|
+
version: 3.0.0.alpha.3
|
60
60
|
type: :runtime
|
61
61
|
prerelease: false
|
62
62
|
version_requirements: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
|
-
- -
|
64
|
+
- - '='
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version: 3.
|
66
|
+
version: 3.0.0.alpha.3
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
68
|
name: minitest
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,18 +142,18 @@ executables: []
|
|
142
142
|
extensions: []
|
143
143
|
extra_rdoc_files: []
|
144
144
|
files:
|
145
|
+
- definitions/google/protobuf/wrappers.proto
|
145
146
|
- definitions/protip/messages/array.proto
|
146
147
|
- definitions/protip/messages/errors.proto
|
147
148
|
- definitions/protip/messages/types.proto
|
148
|
-
-
|
149
|
+
- lib/google/protobuf/wrappers.rb
|
149
150
|
- lib/protip.rb
|
150
151
|
- lib/protip/client.rb
|
151
152
|
- lib/protip/converter.rb
|
152
153
|
- lib/protip/error.rb
|
153
|
-
- lib/protip/messages/array.
|
154
|
-
- lib/protip/messages/errors.
|
155
|
-
- lib/protip/messages/types.
|
156
|
-
- lib/protip/messages/wrappers.pb.rb
|
154
|
+
- lib/protip/messages/array.rb
|
155
|
+
- lib/protip/messages/errors.rb
|
156
|
+
- lib/protip/messages/types.rb
|
157
157
|
- lib/protip/resource.rb
|
158
158
|
- lib/protip/standard_converter.rb
|
159
159
|
- lib/protip/wrapper.rb
|
@@ -1,60 +0,0 @@
|
|
1
|
-
package protip;
|
2
|
-
|
3
|
-
/////
|
4
|
-
// Wrappers, copied from https://github.com/google/protobuf/blob/master/src/google/protobuf/wrappers.proto
|
5
|
-
// These should exactly match the structure of those built-in types, so that users can safely swap them in
|
6
|
-
// when upgrading to proto3.
|
7
|
-
|
8
|
-
// Wrapper message for double.
|
9
|
-
message DoubleValue {
|
10
|
-
// The double value.
|
11
|
-
required double value = 1;
|
12
|
-
}
|
13
|
-
|
14
|
-
// Wrapper message for float.
|
15
|
-
message FloatValue {
|
16
|
-
// The float value.
|
17
|
-
required float value = 1;
|
18
|
-
}
|
19
|
-
|
20
|
-
// Wrapper message for int64.
|
21
|
-
message Int64Value {
|
22
|
-
// The int64 value.
|
23
|
-
required int64 value = 1;
|
24
|
-
}
|
25
|
-
|
26
|
-
// Wrapper message for uint64.
|
27
|
-
message UInt64Value {
|
28
|
-
// The uint64 value.
|
29
|
-
required uint64 value = 1;
|
30
|
-
}
|
31
|
-
|
32
|
-
// Wrapper message for int32.
|
33
|
-
message Int32Value {
|
34
|
-
// The int32 value.
|
35
|
-
required int32 value = 1;
|
36
|
-
}
|
37
|
-
|
38
|
-
// Wrapper message for uint32.
|
39
|
-
message UInt32Value {
|
40
|
-
// The uint32 value.
|
41
|
-
required uint32 value = 1;
|
42
|
-
}
|
43
|
-
|
44
|
-
// Wrapper message for bool.
|
45
|
-
message BoolValue {
|
46
|
-
// The bool value.
|
47
|
-
required bool value = 1;
|
48
|
-
}
|
49
|
-
|
50
|
-
// Wrapper message for string.
|
51
|
-
message StringValue {
|
52
|
-
// The string value.
|
53
|
-
required string value = 1;
|
54
|
-
}
|
55
|
-
|
56
|
-
// Wrapper message for bytes.
|
57
|
-
message BytesValue {
|
58
|
-
// The bytes value.
|
59
|
-
required bytes value = 1;
|
60
|
-
}
|