protip 0.19.2 → 0.20.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/protip/extensions.proto +7 -0
- data/definitions/protip/messages/repeated_wrappers.proto +8 -0
- data/definitions/protip/messages/test.proto +18 -0
- data/definitions/protip/messages/wrappers.proto +9 -0
- data/lib/google/protobuf/descriptor.rb +1 -0
- data/lib/protip/converter.rb +2 -2
- data/lib/protip/extensions.rb +9 -0
- data/lib/protip/messages/repeated_wrappers.rb +5 -0
- data/lib/protip/messages/test.rb +28 -0
- data/lib/protip/messages/wrappers.rb +17 -0
- data/lib/protip/standard_converter.rb +61 -22
- data/lib/protip/wrapper.rb +2 -2
- data/test/test_helper.rb +0 -1
- data/test/unit/protip/resource_test.rb +19 -16
- data/test/unit/protip/standard_converter_test.rb +165 -20
- data/test/unit/protip/wrapper_test.rb +5 -4
- metadata +9 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e9e8d262a3ac9f0a1164c3da1c73895c23eb868
|
4
|
+
data.tar.gz: 6898418d57886241026534c0a04174944a2092c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58bfca0184504abdc837dc766fde21eaa164f02fc22b1b0b3318ffb654bcc909474d0c660234145b8df69de866fc7da86c4c56f8dce71d3dc0769f15d85dbc13
|
7
|
+
data.tar.gz: 84502680643b0aac55ffda5e833381e0f20bae12415977b1a0991e0fa564aa16bf0ec4326870d1495e451e16c0de3d511260cb6b6f8568d396f4c12e0057d1db
|
@@ -1,5 +1,7 @@
|
|
1
1
|
syntax = "proto3";
|
2
2
|
|
3
|
+
import public "protip/extensions.proto";
|
4
|
+
|
3
5
|
package protip.messages;
|
4
6
|
|
5
7
|
message RepeatedDouble {
|
@@ -36,4 +38,10 @@ message RepeatedString {
|
|
36
38
|
|
37
39
|
message RepeatedBytes {
|
38
40
|
repeated bytes values = 1;
|
41
|
+
}
|
42
|
+
|
43
|
+
// Should generally be used with the "protip_enum" option
|
44
|
+
// for serialization to/from Ruby.
|
45
|
+
message RepeatedEnum {
|
46
|
+
repeated int32 values = 1;
|
39
47
|
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
// Should be temporary - enables testing our hacky enum option handling with an actual compiled file.
|
2
|
+
// Do not depend on anything in this file.
|
3
|
+
|
4
|
+
syntax = "proto3";
|
5
|
+
|
6
|
+
import "protip/messages/repeated_wrappers.proto";
|
7
|
+
import "protip/messages/wrappers.proto";
|
8
|
+
|
9
|
+
package protip.messages;
|
10
|
+
|
11
|
+
message EnumTest {
|
12
|
+
enum Enum {
|
13
|
+
ZERO = 0;
|
14
|
+
ONE = 1;
|
15
|
+
}
|
16
|
+
protip.messages.EnumValue enum = 1 [(protip_enum) = "protip.messages.EnumTest.Enum"];
|
17
|
+
protip.messages.RepeatedEnum enums = 2 [(protip_enum) = "protip.messages.EnumTest.Enum"];
|
18
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
# Placeholder file until Google rolls google/protobuf/descriptor into the gem
|
data/lib/protip/converter.rb
CHANGED
@@ -11,11 +11,11 @@ module Protip
|
|
11
11
|
)
|
12
12
|
end
|
13
13
|
|
14
|
-
def to_object(message)
|
14
|
+
def to_object(message, field)
|
15
15
|
raise NotImplementedError.new('Must convert a message into a Ruby object')
|
16
16
|
end
|
17
17
|
|
18
|
-
def to_message(object, message_class)
|
18
|
+
def to_message(object, message_class, field)
|
19
19
|
raise NotImplementedError.new('Must convert a Ruby object into a message of the given type')
|
20
20
|
end
|
21
21
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'google/protobuf'
|
5
5
|
|
6
|
+
require 'protip/extensions'
|
6
7
|
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
8
|
add_message "protip.messages.RepeatedDouble" do
|
8
9
|
repeated :values, :double, 1
|
@@ -31,6 +32,9 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
31
32
|
add_message "protip.messages.RepeatedBytes" do
|
32
33
|
repeated :values, :bytes, 1
|
33
34
|
end
|
35
|
+
add_message "protip.messages.RepeatedEnum" do
|
36
|
+
repeated :values, :int32, 1
|
37
|
+
end
|
34
38
|
end
|
35
39
|
|
36
40
|
module Protip
|
@@ -44,5 +48,6 @@ module Protip
|
|
44
48
|
RepeatedBool = Google::Protobuf::DescriptorPool.generated_pool.lookup("protip.messages.RepeatedBool").msgclass
|
45
49
|
RepeatedString = Google::Protobuf::DescriptorPool.generated_pool.lookup("protip.messages.RepeatedString").msgclass
|
46
50
|
RepeatedBytes = Google::Protobuf::DescriptorPool.generated_pool.lookup("protip.messages.RepeatedBytes").msgclass
|
51
|
+
RepeatedEnum = Google::Protobuf::DescriptorPool.generated_pool.lookup("protip.messages.RepeatedEnum").msgclass
|
47
52
|
end
|
48
53
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: protip/messages/test.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
require 'protip/messages/repeated_wrappers'
|
7
|
+
require 'protip/messages/wrappers'
|
8
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
9
|
+
add_message "protip.messages.EnumTest" do
|
10
|
+
optional :enum, :message, 1, "protip.messages.EnumValue"
|
11
|
+
optional :enums, :message, 2, "protip.messages.RepeatedEnum"
|
12
|
+
end
|
13
|
+
add_enum "protip.messages.EnumTest.Enum" do
|
14
|
+
value :ZERO, 0
|
15
|
+
value :ONE, 1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Protip
|
20
|
+
module Messages
|
21
|
+
EnumTest = Google::Protobuf::DescriptorPool.generated_pool.lookup("protip.messages.EnumTest").msgclass
|
22
|
+
EnumTest::Enum = Google::Protobuf::DescriptorPool.generated_pool.lookup("protip.messages.EnumTest.Enum").enummodule
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# -- Protip hack until https://github.com/google/protobuf/issues/1198 is resolved
|
27
|
+
Google::Protobuf::DescriptorPool.generated_pool.lookup("protip.messages.EnumTest").lookup("enum").instance_variable_set(:"@_protip_enum_value", "protip.messages.EnumTest.Enum")
|
28
|
+
Google::Protobuf::DescriptorPool.generated_pool.lookup("protip.messages.EnumTest").lookup("enums").instance_variable_set(:"@_protip_enum_value", "protip.messages.EnumTest.Enum")
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: protip/messages/wrappers.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
require 'protip/extensions'
|
7
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
8
|
+
add_message "protip.messages.EnumValue" do
|
9
|
+
optional :value, :int32, 1
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Protip
|
14
|
+
module Messages
|
15
|
+
EnumValue = Google::Protobuf::DescriptorPool.generated_pool.lookup("protip.messages.EnumValue").msgclass
|
16
|
+
end
|
17
|
+
end
|
@@ -9,6 +9,7 @@ require 'protip/messages/money'
|
|
9
9
|
require 'protip/messages/range'
|
10
10
|
require 'protip/messages/repeated_wrappers'
|
11
11
|
require 'protip/messages/types'
|
12
|
+
require 'protip/messages/wrappers'
|
12
13
|
require 'google/protobuf'
|
13
14
|
module Protip
|
14
15
|
class StandardConverter
|
@@ -24,15 +25,15 @@ module Protip
|
|
24
25
|
|
25
26
|
## Protip types
|
26
27
|
@conversions['protip.messages.Currency'] = {
|
27
|
-
to_object: ->(message) { message.currency_code },
|
28
|
-
to_message: ->(currency_code, message_class) { message_class.new currency_code: currency_code }
|
28
|
+
to_object: ->(message, field) { message.currency_code },
|
29
|
+
to_message: ->(currency_code, message_class, field) { message_class.new currency_code: currency_code }
|
29
30
|
}
|
30
31
|
|
31
32
|
@conversions['protip.messages.Money'] = {
|
32
|
-
to_object: ->(message) do
|
33
|
+
to_object: ->(message, field) do
|
33
34
|
::Money.new(message.amount_cents, message.currency.currency_code)
|
34
35
|
end,
|
35
|
-
to_message: ->(money, message_class) do
|
36
|
+
to_message: ->(money, message_class, field) do
|
36
37
|
raise ArgumentError unless money.is_a?(::Money)
|
37
38
|
currency = ::Protip::Messages::Currency.new(currency_code: money.currency.iso_code.to_sym)
|
38
39
|
message_class.new(
|
@@ -43,16 +44,16 @@ module Protip
|
|
43
44
|
}
|
44
45
|
|
45
46
|
@conversions['protip.messages.Date'] = {
|
46
|
-
to_object: ->(message) { ::Date.new(message.year, message.month, message.day) },
|
47
|
-
to_message: lambda do |date, message_class|
|
47
|
+
to_object: ->(message, field) { ::Date.new(message.year, message.month, message.day) },
|
48
|
+
to_message: lambda do |date, message_class, field|
|
48
49
|
raise ArgumentError unless date.is_a?(::Date)
|
49
50
|
message_class.new year: date.year, month: date.month, day: date.day
|
50
51
|
end
|
51
52
|
}
|
52
53
|
|
53
54
|
@conversions['protip.messages.Range'] = {
|
54
|
-
to_object: ->(message) { message.begin..message.end },
|
55
|
-
to_message: ->(range, message_class) do
|
55
|
+
to_object: ->(message, field) { message.begin..message.end },
|
56
|
+
to_message: ->(range, message_class, field) do
|
56
57
|
message_class.new(begin: range.begin.to_i, end: range.end.to_i)
|
57
58
|
end
|
58
59
|
}
|
@@ -60,43 +61,76 @@ module Protip
|
|
60
61
|
## Standard wrappers
|
61
62
|
%w(Int64 Int32 UInt64 UInt32 Double Float String Bytes).each do |type|
|
62
63
|
@conversions["google.protobuf.#{type}Value"] = {
|
63
|
-
to_object: ->(message) { message.value },
|
64
|
-
to_message: lambda do |value, message_class|
|
64
|
+
to_object: ->(message, field) { message.value },
|
65
|
+
to_message: lambda do |value, message_class, field|
|
65
66
|
message_class.new value: value
|
66
67
|
end
|
67
68
|
}
|
68
69
|
@conversions["protip.messages.Repeated#{type}"] = {
|
69
|
-
to_object: ->(message) { message.values.to_a.freeze },
|
70
|
-
to_message: lambda do |value, message_class|
|
70
|
+
to_object: ->(message, field) { message.values.to_a.freeze },
|
71
|
+
to_message: lambda do |value, message_class, field|
|
71
72
|
message_class.new values: (value.is_a?(Enumerable) ? value : [value])
|
72
73
|
end
|
73
74
|
}
|
74
75
|
end
|
75
76
|
|
76
77
|
conversions['google.protobuf.BoolValue'] = {
|
77
|
-
to_object: ->(message) { message.value },
|
78
|
-
to_message: lambda do |value, message_class|
|
78
|
+
to_object: ->(message, field) { message.value },
|
79
|
+
to_message: lambda do |value, message_class, field|
|
79
80
|
message_class.new value: value_to_boolean(value)
|
80
81
|
end
|
81
82
|
}
|
82
83
|
|
83
84
|
conversions['protip.messages.RepeatedBool'] = {
|
84
|
-
to_object: ->(message) { message.values.to_a.freeze },
|
85
|
-
to_message: lambda do |value, message_class|
|
85
|
+
to_object: ->(message, field) { message.values.to_a.freeze },
|
86
|
+
to_message: lambda do |value, message_class, field|
|
86
87
|
message_class.new values: (value.is_a?(Enumerable) ? value : [value]).map{|v| value_to_boolean(v)}
|
87
88
|
end
|
88
89
|
|
89
90
|
}
|
90
91
|
|
92
|
+
conversions['protip.messages.EnumValue'] = {
|
93
|
+
to_object: lambda do |message, field|
|
94
|
+
enum_for_field(field).lookup_value(message.value) || message.value
|
95
|
+
end,
|
96
|
+
to_message: lambda do |value, message_class, field|
|
97
|
+
enum_value = (value.is_a?(Fixnum) ? value : enum_for_field(field).lookup_name(value.to_sym))
|
98
|
+
if nil == enum_value
|
99
|
+
raise RangeError.new('Unknown symbol value for an EnumValue field.')
|
100
|
+
end
|
101
|
+
message_class.new(value: enum_value)
|
102
|
+
end
|
103
|
+
}
|
104
|
+
|
105
|
+
conversions['protip.messages.RepeatedEnum'] = {
|
106
|
+
to_object: lambda do |message, field|
|
107
|
+
enum = enum_for_field(field)
|
108
|
+
message.values.map{|v| enum.lookup_value(v) || v}
|
109
|
+
end,
|
110
|
+
to_message: lambda do |values, message_class, field|
|
111
|
+
enum = nil # Don't look this up unless we have to
|
112
|
+
(values = [values]) unless values.is_a?(Enumerable) # Convert to an array if a scalar was given
|
113
|
+
# Convert values in the same way we do for +protip.messages.EnumValue+
|
114
|
+
message_class.new values: (values.map do |value|
|
115
|
+
if value.is_a?(Fixnum)
|
116
|
+
value
|
117
|
+
else
|
118
|
+
enum ||= enum_for_field(field)
|
119
|
+
enum.lookup_name(value.to_sym) || (raise RangeError.new('Unknown symbol value for a RepeatedEnum field.'))
|
120
|
+
end
|
121
|
+
end)
|
122
|
+
end
|
123
|
+
}
|
124
|
+
|
91
125
|
## ActiveSupport objects
|
92
126
|
conversions['protip.messages.ActiveSupport.TimeWithZone'] = {
|
93
|
-
to_object: ->(message) {
|
127
|
+
to_object: ->(message, field) {
|
94
128
|
ActiveSupport::TimeWithZone.new(
|
95
129
|
Time.at(message.utc_timestamp).utc,
|
96
130
|
ActiveSupport::TimeZone.new(message.time_zone_name)
|
97
131
|
)
|
98
132
|
},
|
99
|
-
to_message: ->(value, message_class) {
|
133
|
+
to_message: ->(value, message_class, field) {
|
100
134
|
if !value.is_a?(::ActiveSupport::TimeWithZone) && (value.is_a?(Time) || value.is_a?(DateTime))
|
101
135
|
value = ::ActiveSupport::TimeWithZone.new(value.to_time.utc, ::ActiveSupport::TimeZone.new('UTC'))
|
102
136
|
end
|
@@ -113,12 +147,12 @@ module Protip
|
|
113
147
|
self.class.conversions.has_key?(message_class.descriptor.name)
|
114
148
|
end
|
115
149
|
|
116
|
-
def to_object(message)
|
117
|
-
self.class.conversions[message.class.descriptor.name][:to_object].call(message)
|
150
|
+
def to_object(message, field)
|
151
|
+
self.class.conversions[message.class.descriptor.name][:to_object].call(message, field)
|
118
152
|
end
|
119
153
|
|
120
|
-
def to_message(object, message_class)
|
121
|
-
self.class.conversions[message_class.descriptor.name][:to_message].call(object, message_class)
|
154
|
+
def to_message(object, message_class, field)
|
155
|
+
self.class.conversions[message_class.descriptor.name][:to_message].call(object, message_class, field)
|
122
156
|
end
|
123
157
|
|
124
158
|
class << self
|
@@ -130,6 +164,11 @@ module Protip
|
|
130
164
|
# exception)
|
131
165
|
value
|
132
166
|
end
|
167
|
+
|
168
|
+
private
|
169
|
+
def enum_for_field(field)
|
170
|
+
Google::Protobuf::DescriptorPool.generated_pool.lookup(field.instance_variable_get(:'@_protip_enum_value'))
|
171
|
+
end
|
133
172
|
end
|
134
173
|
end
|
135
174
|
end
|
data/lib/protip/wrapper.rb
CHANGED
@@ -187,7 +187,7 @@ module Protip
|
|
187
187
|
if nil == value
|
188
188
|
nil
|
189
189
|
elsif converter.convertible?(field.subtype.msgclass)
|
190
|
-
converter.to_object value
|
190
|
+
converter.to_object value, field
|
191
191
|
elsif nested_resources.has_key?(field_name_sym)
|
192
192
|
resource_klass = nested_resources[field_name_sym]
|
193
193
|
resource_klass.new value
|
@@ -217,7 +217,7 @@ module Protip
|
|
217
217
|
elsif value.is_a?(field.subtype.msgclass)
|
218
218
|
value
|
219
219
|
elsif converter.convertible?(field.subtype.msgclass)
|
220
|
-
converter.to_message value, field.subtype.msgclass
|
220
|
+
converter.to_message value, field.subtype.msgclass, field
|
221
221
|
elsif nested_resources.has_key?(field.name.to_sym)
|
222
222
|
value.message
|
223
223
|
else
|
data/test/test_helper.rb
CHANGED
@@ -63,6 +63,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
63
63
|
pool.lookup(name).msgclass
|
64
64
|
end
|
65
65
|
end
|
66
|
+
let(:nested_message_field) { resource_message_class.descriptor.lookup('nested_message') }
|
66
67
|
# Stubbed API client
|
67
68
|
let :client do
|
68
69
|
mock.responds_like_instance_of(Class.new { include Protip::Client })
|
@@ -158,8 +159,8 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
158
159
|
|
159
160
|
it 'converts message types to and from their Ruby values when the converter allows' do
|
160
161
|
converter.expects(:convertible?).at_least_once.with(nested_message_class).returns(true)
|
161
|
-
converter.expects(:to_message).once.with(6, nested_message_class).returns(nested_message_class.new number: 100)
|
162
|
-
converter.expects(:to_object).at_least_once.with(nested_message_class.new
|
162
|
+
converter.expects(:to_message).once.with(6, nested_message_class, nested_message_field).returns(nested_message_class.new number: 100)
|
163
|
+
converter.expects(:to_object).at_least_once.with(nested_message_class.new(number: 100), nested_message_field).returns 'intern'
|
163
164
|
|
164
165
|
resource = resource_class.new
|
165
166
|
resource.nested_message = 6
|
@@ -243,8 +244,8 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
243
244
|
before do
|
244
245
|
# Sanity check - the user should specify all these variables in "let" statements
|
245
246
|
# http_method, path, query_class, and response specify the expected call to the client
|
246
|
-
#
|
247
|
-
# refer to a submessage field of type nested_message_class
|
247
|
+
# nested_message_field_name specifies the field on the query class that may or may not be convertible, and
|
248
|
+
# should refer to a submessage field of type nested_message_class
|
248
249
|
# invoke_method! should call the desired method, assuming that +parameters+ contains the query parameters to
|
249
250
|
# pass in (e.g. `resource_class.all(parameters)` or `resource_class.find('id', parameters)`)
|
250
251
|
%i(
|
@@ -252,7 +253,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
252
253
|
path
|
253
254
|
query_class
|
254
255
|
response
|
255
|
-
|
256
|
+
nested_message_field_name
|
256
257
|
invoke_method!
|
257
258
|
).each do |name|
|
258
259
|
raise "Must define #{name} before invoking `it_converts_query_parameters`" unless respond_to?(name)
|
@@ -262,7 +263,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
262
263
|
client.expects(:request)
|
263
264
|
.once
|
264
265
|
.with(method: http_method, path: path,
|
265
|
-
message: query_class.new(:"#{
|
266
|
+
message: query_class.new(:"#{nested_message_field_name}" => nested_message_class.new(number: 43)),
|
266
267
|
response_type: (nil == response ? nil : response.class),
|
267
268
|
).returns(response)
|
268
269
|
end
|
@@ -272,10 +273,12 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
272
273
|
describe 'with a convertible message' do
|
273
274
|
before do
|
274
275
|
resource_class.converter.stubs(:convertible?).with(nested_message_class).returns(true)
|
275
|
-
resource_class.converter.stubs(:to_message)
|
276
|
+
resource_class.converter.stubs(:to_message)
|
277
|
+
.with(42, nested_message_class, query_class.descriptor.lookup(nested_message_field_name.to_s))
|
278
|
+
.returns(nested_message_class.new(number: 43))
|
276
279
|
end
|
277
280
|
|
278
|
-
let(:parameters) { {"#{
|
281
|
+
let(:parameters) { {"#{nested_message_field_name}" => 42} }
|
279
282
|
it 'converts query parameters' do
|
280
283
|
invoke_method!
|
281
284
|
end
|
@@ -288,14 +291,14 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
288
291
|
end
|
289
292
|
|
290
293
|
describe 'with a hash' do
|
291
|
-
let(:parameters) { {"#{
|
294
|
+
let(:parameters) { {"#{nested_message_field_name}" => {number: 43}} }
|
292
295
|
it 'allows a hash to be provided for the nested message' do
|
293
296
|
invoke_method!
|
294
297
|
end
|
295
298
|
end
|
296
299
|
|
297
300
|
describe 'with a submessage' do
|
298
|
-
let(:parameters) { {"#{
|
301
|
+
let(:parameters) { {"#{nested_message_field_name}" => nested_message_class.new(number: 43)} }
|
299
302
|
it 'allows a submessage to be provided directly' do
|
300
303
|
invoke_method!
|
301
304
|
end
|
@@ -398,7 +401,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
398
401
|
let(:http_method) { Net::HTTP::Get }
|
399
402
|
let(:path) { 'base_path' }
|
400
403
|
let(:query_class) { resource_query_class }
|
401
|
-
let(:
|
404
|
+
let(:nested_message_field_name) { :nested_message }
|
402
405
|
let(:invoke_method!) { resource_class.all(parameters) }
|
403
406
|
it_converts_query_parameters
|
404
407
|
end
|
@@ -482,7 +485,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
482
485
|
let(:http_method) { Net::HTTP::Get }
|
483
486
|
let(:path) { 'base_path/5' }
|
484
487
|
let(:query_class) { resource_query_class }
|
485
|
-
let(:
|
488
|
+
let(:nested_message_field_name) { :nested_message }
|
486
489
|
let(:invoke_method!) { resource_class.find 5, parameters }
|
487
490
|
it_converts_query_parameters
|
488
491
|
end
|
@@ -571,9 +574,9 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
571
574
|
describe '(message attributes)' do
|
572
575
|
before do
|
573
576
|
converter.stubs(:convertible?).with(nested_message_class).returns(true)
|
574
|
-
converter.stubs(:to_message).with(42, nested_message_class).returns(nested_message_class.new(number: 52))
|
575
|
-
converter.stubs(:to_object).with(nested_message_class.new(number: 52)).returns(42)
|
576
|
-
converter.stubs(:to_object).with(nested_message_class.new(number: 62)).returns(72)
|
577
|
+
converter.stubs(:to_message).with(42, nested_message_class, nested_message_field).returns(nested_message_class.new(number: 52))
|
578
|
+
converter.stubs(:to_object).with(nested_message_class.new(number: 52), nested_message_field).returns(42)
|
579
|
+
converter.stubs(:to_object).with(nested_message_class.new(number: 62), nested_message_field).returns(72)
|
577
580
|
end
|
578
581
|
it 'marks convertible messages as changed if they are changed as Ruby values' do
|
579
582
|
setter.set nested_message: 42
|
@@ -937,7 +940,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
937
940
|
let(:http_method) { Net::HTTP::Post }
|
938
941
|
let(:path) { path }
|
939
942
|
let(:query_class) { action_query_class }
|
940
|
-
let(:
|
943
|
+
let(:nested_message_field_name) { :nested_message }
|
941
944
|
let(:invoke_method!) { target.action(parameters) }
|
942
945
|
it_converts_query_parameters
|
943
946
|
end
|
@@ -4,8 +4,23 @@ require 'money'
|
|
4
4
|
require 'google/protobuf/wrappers'
|
5
5
|
require 'protip/messages/active_support/time_with_zone'
|
6
6
|
require 'protip/standard_converter'
|
7
|
+
require 'protip/messages/test'
|
7
8
|
|
8
9
|
describe Protip::StandardConverter do
|
10
|
+
let :pool do
|
11
|
+
# See https://github.com/google/protobuf/blob/master/ruby/tests/generated_code.rb for
|
12
|
+
# examples of field types you can add here
|
13
|
+
pool = Google::Protobuf::DescriptorPool.new
|
14
|
+
pool.build do
|
15
|
+
add_enum 'number' do
|
16
|
+
value :ZERO, 0
|
17
|
+
value :ONE, 1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
pool
|
21
|
+
end
|
22
|
+
let(:enum) { pool.lookup 'number' }
|
23
|
+
|
9
24
|
let(:converter) { Protip::StandardConverter.new }
|
10
25
|
|
11
26
|
let(:integer_types) do
|
@@ -94,6 +109,8 @@ describe Protip::StandardConverter do
|
|
94
109
|
end
|
95
110
|
end
|
96
111
|
|
112
|
+
let(:field) { mock.responds_like_instance_of Google::Protobuf::FieldDescriptor }
|
113
|
+
|
97
114
|
describe '#to_object' do
|
98
115
|
it 'converts wrapper types' do
|
99
116
|
{
|
@@ -104,7 +121,7 @@ describe Protip::StandardConverter do
|
|
104
121
|
bytes_value => bytes_types,
|
105
122
|
}.each do |value, message_types|
|
106
123
|
message_types.each do |message_class|
|
107
|
-
assert_equal value, converter.to_object(message_class.new
|
124
|
+
assert_equal value, converter.to_object(message_class.new(value: value), field)
|
108
125
|
end
|
109
126
|
end
|
110
127
|
end
|
@@ -118,7 +135,7 @@ describe Protip::StandardConverter do
|
|
118
135
|
bytes_value => repeated_bytes_types,
|
119
136
|
}.each do |value, message_types|
|
120
137
|
message_types.each do |message_class|
|
121
|
-
result = converter.to_object(message_class.new
|
138
|
+
result = converter.to_object(message_class.new(values: [value]), field)
|
122
139
|
assert_equal [value], result
|
123
140
|
exception = assert_raises RuntimeError do
|
124
141
|
result << value
|
@@ -129,26 +146,26 @@ describe Protip::StandardConverter do
|
|
129
146
|
end
|
130
147
|
|
131
148
|
it 'converts dates' do
|
132
|
-
date = converter.to_object(::Protip::Messages::Date.new
|
149
|
+
date = converter.to_object(::Protip::Messages::Date.new(year: 2015, month: 2, day: 9), field)
|
133
150
|
assert_instance_of ::Date, date
|
134
151
|
assert_equal '2015-02-09', date.strftime
|
135
152
|
end
|
136
153
|
|
137
154
|
it 'converts ranges' do
|
138
|
-
range = converter.to_object(::Protip::Messages::Range.new
|
155
|
+
range = converter.to_object(::Protip::Messages::Range.new(begin: 1, end: 4), field)
|
139
156
|
assert_instance_of ::Range, range
|
140
157
|
assert_equal 1..4, range
|
141
158
|
end
|
142
159
|
|
143
160
|
it 'converts currency' do
|
144
|
-
currency = converter.to_object(::Protip::Messages::Currency.new
|
161
|
+
currency = converter.to_object(::Protip::Messages::Currency.new(currency_code: :GBP), field)
|
145
162
|
assert_equal :GBP, currency
|
146
163
|
end
|
147
164
|
|
148
165
|
it 'converts money' do
|
149
166
|
message = ::Protip::Messages::Money.new amount_cents: 250,
|
150
167
|
currency: (::Protip::Messages::Currency.new currency_code: :CAD)
|
151
|
-
money = converter.to_object(message)
|
168
|
+
money = converter.to_object(message, field)
|
152
169
|
assert_instance_of ::Money, money
|
153
170
|
assert_equal Money::Currency.new(:CAD), money.currency
|
154
171
|
assert_equal 250, money.fractional
|
@@ -158,11 +175,42 @@ describe Protip::StandardConverter do
|
|
158
175
|
it 'converts times with zones' do
|
159
176
|
message = ::Protip::Messages::ActiveSupport::TimeWithZone.new utc_timestamp: 1451610000,
|
160
177
|
time_zone_name: 'America/Los_Angeles'
|
161
|
-
time = converter.to_object(message)
|
178
|
+
time = converter.to_object(message, field)
|
162
179
|
assert_instance_of ::ActiveSupport::TimeWithZone, time
|
163
180
|
assert_equal 1451610000, time.to_i
|
164
181
|
assert_equal '2015-12-31T17:00:00-08:00', time.iso8601
|
165
182
|
end
|
183
|
+
|
184
|
+
describe 'enums' do
|
185
|
+
before do
|
186
|
+
::Protip::StandardConverter.stubs(:enum_for_field).with(field).returns(enum)
|
187
|
+
end
|
188
|
+
|
189
|
+
# Make sure we mirror the behavior of an actual enum field on the message.
|
190
|
+
it 'converts enum values in range to symbols' do
|
191
|
+
message = ::Protip::Messages::EnumValue.new value: 1
|
192
|
+
assert_equal :ONE, converter.to_object(message, field)
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'converts enum values out of range to integers' do
|
196
|
+
message = ::Protip::Messages::EnumValue.new value: 5
|
197
|
+
assert_equal 5, converter.to_object(message, field)
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'converts repeated enum values in range to symbols' do
|
201
|
+
message = ::Protip::Messages::RepeatedEnum.new values: [0, 1]
|
202
|
+
assert_equal [:ZERO, :ONE], converter.to_object(message, field)
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'converts repeated enum values out of range to integers' do
|
206
|
+
message = ::Protip::Messages::RepeatedEnum.new values: [3, 1, 5]
|
207
|
+
assert_equal [3, :ONE, 5], converter.to_object(message, field)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe '.enum_for_field' do
|
213
|
+
# TODO pending https://github.com/google/protobuf/issues/1198
|
166
214
|
end
|
167
215
|
|
168
216
|
describe '#to_message' do
|
@@ -175,7 +223,7 @@ describe Protip::StandardConverter do
|
|
175
223
|
bytes_value => bytes_types,
|
176
224
|
}.each do |value, message_types|
|
177
225
|
message_types.each do |message_class|
|
178
|
-
assert_equal message_class.new(value: value), converter.to_message(value, message_class)
|
226
|
+
assert_equal message_class.new(value: value), converter.to_message(value, message_class, field)
|
179
227
|
end
|
180
228
|
end
|
181
229
|
end
|
@@ -189,7 +237,7 @@ describe Protip::StandardConverter do
|
|
189
237
|
bytes_value => repeated_bytes_types,
|
190
238
|
}.each do |value, message_types|
|
191
239
|
message_types.each do |message_class|
|
192
|
-
assert_equal message_class.new(values: [value]), converter.to_message(value, message_class)
|
240
|
+
assert_equal message_class.new(values: [value]), converter.to_message(value, message_class, field)
|
193
241
|
end
|
194
242
|
end
|
195
243
|
end
|
@@ -203,7 +251,9 @@ describe Protip::StandardConverter do
|
|
203
251
|
bytes_value => repeated_bytes_types,
|
204
252
|
}.each do |value, message_types|
|
205
253
|
message_types.each do |message_class|
|
206
|
-
assert_equal message_class.new(values: [value, value]), converter.to_message(
|
254
|
+
assert_equal message_class.new(values: [value, value]), converter.to_message(
|
255
|
+
[value, value], message_class, field
|
256
|
+
)
|
207
257
|
end
|
208
258
|
end
|
209
259
|
end
|
@@ -211,23 +261,23 @@ describe Protip::StandardConverter do
|
|
211
261
|
it 'converts dates' do
|
212
262
|
date = ::Date.new(2012, 5, 7)
|
213
263
|
assert_equal 7, date.day # Sanity check argument order
|
214
|
-
assert_equal ::Protip::Messages::Date.new(year: 2012, month: 5, day: 7), converter.to_message(date, ::Protip::Messages::Date)
|
264
|
+
assert_equal ::Protip::Messages::Date.new(year: 2012, month: 5, day: 7), converter.to_message(date, ::Protip::Messages::Date, field)
|
215
265
|
end
|
216
266
|
|
217
267
|
it 'converts ranges' do
|
218
268
|
range = -1..34
|
219
|
-
assert_equal ::Protip::Messages::Range.new(begin: -1, end: 34), converter.to_message(range, ::Protip::Messages::Range)
|
269
|
+
assert_equal ::Protip::Messages::Range.new(begin: -1, end: 34), converter.to_message(range, ::Protip::Messages::Range, field)
|
220
270
|
end
|
221
271
|
|
222
272
|
it 'converts currency' do
|
223
273
|
currency = :HKD
|
224
|
-
message = converter.to_message(currency, ::Protip::Messages::Currency)
|
274
|
+
message = converter.to_message(currency, ::Protip::Messages::Currency, field)
|
225
275
|
assert_equal ::Protip::Messages::Currency.new(currency_code: currency), message
|
226
276
|
end
|
227
277
|
|
228
278
|
it 'converts money' do
|
229
279
|
money = ::Money.new(250, 'CAD')
|
230
|
-
message = converter.to_message(money, ::Protip::Messages::Money)
|
280
|
+
message = converter.to_message(money, ::Protip::Messages::Money, field)
|
231
281
|
assert_instance_of ::Protip::Messages::Money, message
|
232
282
|
assert_equal ::Protip::Messages::Money.new(
|
233
283
|
amount_cents: money.cents,
|
@@ -240,21 +290,21 @@ describe Protip::StandardConverter do
|
|
240
290
|
it 'converts truthy values to booleans' do
|
241
291
|
[true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON'].each do |truth_value|
|
242
292
|
assert_equal Google::Protobuf::BoolValue.new(value: true),
|
243
|
-
converter.to_message(truth_value, Google::Protobuf::BoolValue)
|
293
|
+
converter.to_message(truth_value, Google::Protobuf::BoolValue, field)
|
244
294
|
end
|
245
295
|
end
|
246
296
|
|
247
297
|
it 'converts falsey values to booleans' do
|
248
298
|
[false, 0, '0', 'f', 'F', 'false', 'FALSE', 'off', 'OFF'].each do |false_value|
|
249
299
|
assert_equal Google::Protobuf::BoolValue.new(value: false),
|
250
|
-
converter.to_message(false_value, Google::Protobuf::BoolValue)
|
300
|
+
converter.to_message(false_value, Google::Protobuf::BoolValue, field)
|
251
301
|
end
|
252
302
|
end
|
253
303
|
|
254
304
|
it 'raises an exception if non-boolean values passed to boolean field' do
|
255
305
|
[nil, 'test', Object.new, 2, {}, []].each do |bad_value|
|
256
306
|
assert_raises TypeError do
|
257
|
-
converter.to_message(bad_value, Google::Protobuf::BoolValue)
|
307
|
+
converter.to_message(bad_value, Google::Protobuf::BoolValue, field)
|
258
308
|
end
|
259
309
|
end
|
260
310
|
end
|
@@ -262,24 +312,119 @@ describe Protip::StandardConverter do
|
|
262
312
|
it 'converts times with zones' do
|
263
313
|
time_with_zone = ::ActiveSupport::TimeWithZone.new(Time.new(2016, 1, 1, 0, 0, 0, 0),
|
264
314
|
::ActiveSupport::TimeZone.new('America/New_York'))
|
265
|
-
message = converter.to_message(time_with_zone, ::Protip::Messages::ActiveSupport::TimeWithZone)
|
315
|
+
message = converter.to_message(time_with_zone, ::Protip::Messages::ActiveSupport::TimeWithZone, field)
|
266
316
|
assert_equal 1451606400, message.utc_timestamp
|
267
317
|
assert_equal 'America/New_York', message.time_zone_name
|
268
318
|
end
|
269
319
|
|
270
320
|
it 'converts times without zones' do
|
271
321
|
time = Time.new(2016, 1, 1, 0, 0, 0, -3600)
|
272
|
-
message = converter.to_message(time, ::Protip::Messages::ActiveSupport::TimeWithZone)
|
322
|
+
message = converter.to_message(time, ::Protip::Messages::ActiveSupport::TimeWithZone, field)
|
273
323
|
assert_equal 1451610000, message.utc_timestamp
|
274
324
|
assert_equal 'UTC', message.time_zone_name
|
275
325
|
end
|
276
326
|
|
277
327
|
it 'converts datetimes without zones' do
|
278
328
|
datetime = DateTime.new(2016, 1, 1, 0, 0, 0, '-1')
|
279
|
-
message = converter.to_message(datetime, ::Protip::Messages::ActiveSupport::TimeWithZone)
|
329
|
+
message = converter.to_message(datetime, ::Protip::Messages::ActiveSupport::TimeWithZone, field)
|
280
330
|
assert_equal 1451610000, message.utc_timestamp
|
281
331
|
assert_equal 'UTC', message.time_zone_name
|
282
332
|
|
283
333
|
end
|
334
|
+
|
335
|
+
describe 'enums' do
|
336
|
+
before do
|
337
|
+
::Protip::StandardConverter.stubs(:enum_for_field).with(field).returns(enum)
|
338
|
+
end
|
339
|
+
def convert(value)
|
340
|
+
converter.to_message value, message_class, field
|
341
|
+
end
|
342
|
+
%w(zero one two).each do |number| # values symbolizing as :ZERO, :ONE, :TWO
|
343
|
+
let number do
|
344
|
+
value = mock
|
345
|
+
value.stubs(:to_sym).returns(number.upcase.to_sym)
|
346
|
+
value
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
describe '::Protip::Messages::EnumValue' do
|
351
|
+
let(:message_class) { ::Protip::Messages::EnumValue }
|
352
|
+
# Ensure identical behavior to setting a standard enum field
|
353
|
+
it 'converts integers' do
|
354
|
+
assert_equal 1, convert(1).value, 'improper conversion of an in-range integer'
|
355
|
+
assert_equal 4, convert(4).value, 'improper conversion of an out-of-range integer'
|
356
|
+
end
|
357
|
+
it 'converts non-integers via to_sym' do
|
358
|
+
assert_equal 1, convert(one).value, 'improper conversion of non-integer value'
|
359
|
+
end
|
360
|
+
it 'throws an error when a non-existent symbol is given' do
|
361
|
+
assert_raises RangeError do
|
362
|
+
convert(two)
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
describe '::Protip::Messages::RepeatedEnum' do
|
368
|
+
let(:message_class) { ::Protip::Messages::RepeatedEnum }
|
369
|
+
it 'converts integers' do
|
370
|
+
assert_equal [1, 4], convert([1, 4]).values
|
371
|
+
end
|
372
|
+
it 'converts non-integers via to_sym' do
|
373
|
+
assert_equal [0, 2, 1], convert([zero, 2, one]).values
|
374
|
+
end
|
375
|
+
it 'throws an error when a non-existent symbol is given' do
|
376
|
+
assert_raises RangeError do
|
377
|
+
convert([0, two])
|
378
|
+
end
|
379
|
+
end
|
380
|
+
it 'allows assigning a scalar value' do
|
381
|
+
assert_equal [1], convert(one).values
|
382
|
+
end
|
383
|
+
end
|
384
|
+
end
|
284
385
|
end
|
386
|
+
|
387
|
+
describe '(enums - functional)' do # Temp - test an actual compiled file to make sure our options hack is working
|
388
|
+
let(:wrapped_message) { Protip::Messages::EnumTest.new }
|
389
|
+
let(:wrapper) { Protip::Wrapper.new wrapped_message, converter }
|
390
|
+
|
391
|
+
let(:value_map) do
|
392
|
+
{
|
393
|
+
:ONE => :ONE,
|
394
|
+
1 => :ONE,
|
395
|
+
2 => 2,
|
396
|
+
}
|
397
|
+
end
|
398
|
+
|
399
|
+
it 'allows setting and getting a scalar field by Ruby value' do
|
400
|
+
value_map.each do |value, expected|
|
401
|
+
wrapper.enum = value
|
402
|
+
assert_equal expected, wrapper.enum
|
403
|
+
end
|
404
|
+
assert_raises RangeError do
|
405
|
+
wrapper.enum = :TWO
|
406
|
+
end
|
407
|
+
end
|
408
|
+
it 'allows setting and getting a scalar field by message' do
|
409
|
+
wrapper.enum = ::Protip::Messages::EnumValue.new(value: 1)
|
410
|
+
assert_equal :ONE, wrapper.enum
|
411
|
+
end
|
412
|
+
|
413
|
+
it 'allows setting and getting a repeated field by Ruby value' do
|
414
|
+
value_map.each do |value, expected|
|
415
|
+
wrapper.enums = [value]
|
416
|
+
assert_equal [expected], wrapper.enums
|
417
|
+
end
|
418
|
+
assert_raises RangeError do
|
419
|
+
wrapper.enums = [:TWO]
|
420
|
+
end
|
421
|
+
end
|
422
|
+
it 'allows setting and geting a repeated field by message' do
|
423
|
+
wrapper.enums = ::Protip::Messages::RepeatedEnum.new(values: [2])
|
424
|
+
assert_equal [2], wrapper.enums
|
425
|
+
end
|
426
|
+
|
427
|
+
|
428
|
+
end
|
429
|
+
|
285
430
|
end
|
@@ -59,6 +59,7 @@ module Protip::WrapperTest # namespace for internal constants
|
|
59
59
|
pool.lookup(name).msgclass
|
60
60
|
end
|
61
61
|
end
|
62
|
+
let (:inner_message_field) { message_class.descriptor.lookup('inner') }
|
62
63
|
|
63
64
|
# Stubbed API client
|
64
65
|
let :client do
|
@@ -209,7 +210,7 @@ module Protip::WrapperTest # namespace for internal constants
|
|
209
210
|
end
|
210
211
|
|
211
212
|
it 'converts scalar Ruby values to protobuf messages' do
|
212
|
-
converter.expects(:to_message).once.with(45, inner_message_class).returns(inner_message_class.new(value: 43))
|
213
|
+
converter.expects(:to_message).once.with(45, inner_message_class, inner_message_field).returns(inner_message_class.new(value: 43))
|
213
214
|
wrapper.assign_attributes inner: 45
|
214
215
|
assert_equal inner_message_class.new(value: 43), wrapped_message.inner
|
215
216
|
end
|
@@ -329,7 +330,7 @@ module Protip::WrapperTest # namespace for internal constants
|
|
329
330
|
describe 'with a nested convertible message' do
|
330
331
|
before do
|
331
332
|
converter.stubs(:convertible?).with(inner_message_class).returns true
|
332
|
-
[1, 2, 3].each{|i| converter.stubs(:to_object).with(inner_message_class.new(value: i)).returns(i)}
|
333
|
+
[1, 2, 3].each{|i| converter.stubs(:to_object).with(inner_message_class.new(value: i), anything).returns(i)}
|
333
334
|
end
|
334
335
|
it 'returns a hash with the nested message converted' do
|
335
336
|
assert_equal 1, wrapper.to_h[:inner]
|
@@ -385,7 +386,7 @@ module Protip::WrapperTest # namespace for internal constants
|
|
385
386
|
|
386
387
|
it 'converts convertible messages' do
|
387
388
|
converter.expects(:convertible?).with(inner_message_class).once.returns(true)
|
388
|
-
converter.expects(:to_object).once.with(inner_message_class.new(value: 25)).returns 40
|
389
|
+
converter.expects(:to_object).once.with(inner_message_class.new(value: 25), inner_message_field).returns 40
|
389
390
|
assert_equal 40, wrapper.inner
|
390
391
|
end
|
391
392
|
|
@@ -445,7 +446,7 @@ module Protip::WrapperTest # namespace for internal constants
|
|
445
446
|
|
446
447
|
it 'converts convertible messages' do
|
447
448
|
converter.expects(:convertible?).at_least_once.with(inner_message_class).returns(true)
|
448
|
-
converter.expects(:to_message).with(40, inner_message_class).returns(inner_message_class.new(value: 30))
|
449
|
+
converter.expects(:to_message).with(40, inner_message_class, inner_message_field).returns(inner_message_class.new(value: 30))
|
449
450
|
|
450
451
|
wrapper.inner = 40
|
451
452
|
assert_equal inner_message_class.new(value: 30), wrapper.message.inner
|
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.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AngelList
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -98,20 +98,6 @@ dependencies:
|
|
98
98
|
- - "~>"
|
99
99
|
- !ruby/object:Gem::Version
|
100
100
|
version: '5.0'
|
101
|
-
- !ruby/object:Gem::Dependency
|
102
|
-
name: minitest-debugger
|
103
|
-
requirement: !ruby/object:Gem::Requirement
|
104
|
-
requirements:
|
105
|
-
- - "~>"
|
106
|
-
- !ruby/object:Gem::Version
|
107
|
-
version: '1.0'
|
108
|
-
type: :development
|
109
|
-
prerelease: false
|
110
|
-
version_requirements: !ruby/object:Gem::Requirement
|
111
|
-
requirements:
|
112
|
-
- - "~>"
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
version: '1.0'
|
115
101
|
- !ruby/object:Gem::Dependency
|
116
102
|
name: minitest-stub-const
|
117
103
|
requirement: !ruby/object:Gem::Requirement
|
@@ -193,6 +179,7 @@ extensions: []
|
|
193
179
|
extra_rdoc_files: []
|
194
180
|
files:
|
195
181
|
- definitions/google/protobuf/wrappers.proto
|
182
|
+
- definitions/protip/extensions.proto
|
196
183
|
- definitions/protip/messages/active_support/time_with_zone.proto
|
197
184
|
- definitions/protip/messages/array.proto
|
198
185
|
- definitions/protip/messages/currency.proto
|
@@ -200,12 +187,16 @@ files:
|
|
200
187
|
- definitions/protip/messages/money.proto
|
201
188
|
- definitions/protip/messages/range.proto
|
202
189
|
- definitions/protip/messages/repeated_wrappers.proto
|
190
|
+
- definitions/protip/messages/test.proto
|
203
191
|
- definitions/protip/messages/types.proto
|
192
|
+
- definitions/protip/messages/wrappers.proto
|
193
|
+
- lib/google/protobuf/descriptor.rb
|
204
194
|
- lib/google/protobuf/wrappers.rb
|
205
195
|
- lib/protip.rb
|
206
196
|
- lib/protip/client.rb
|
207
197
|
- lib/protip/converter.rb
|
208
198
|
- lib/protip/error.rb
|
199
|
+
- lib/protip/extensions.rb
|
209
200
|
- lib/protip/messages/active_support/time_with_zone.rb
|
210
201
|
- lib/protip/messages/array.rb
|
211
202
|
- lib/protip/messages/currency.rb
|
@@ -213,7 +204,9 @@ files:
|
|
213
204
|
- lib/protip/messages/money.rb
|
214
205
|
- lib/protip/messages/range.rb
|
215
206
|
- lib/protip/messages/repeated_wrappers.rb
|
207
|
+
- lib/protip/messages/test.rb
|
216
208
|
- lib/protip/messages/types.rb
|
209
|
+
- lib/protip/messages/wrappers.rb
|
217
210
|
- lib/protip/resource.rb
|
218
211
|
- lib/protip/resource/associations/association.rb
|
219
212
|
- lib/protip/resource/associations/belongs_to_association.rb
|