neuron-client 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -68,17 +68,25 @@ module Neuron
68
68
 
69
69
  STATISTIC_TYPES = %w(selections undeliveries impressions redirects clicks)
70
70
 
71
- def recent(statistic, by=nil)
71
+ def recent(statistic, parameters={})
72
72
  connected_to_admin!
73
+ by = (parameters[:by] || parameters['by']).to_s
74
+ minutes = parameters[:minutes] || parameters['minutes']
75
+ parameters = {}
76
+ parameters['by'] = by unless by.blank?
77
+ parameters['minutes'] = minutes.to_i if minutes.to_i > 0
73
78
  if validate?
74
79
  unless STATISTIC_TYPES.include?(statistic.to_s)
75
80
  raise "Unsupported statistic: #{statistic}"
76
81
  end
77
- unless by.nil? || by.to_s == 'zone'
82
+ unless by.blank? || by == 'zone'
78
83
  raise "Unsupported by: #{by}"
79
84
  end
85
+ unless minutes.blank? || minutes.to_i > 0
86
+ raise "Unsupported minutes: #{minutes}"
87
+ end
80
88
  end
81
- parameters = by.nil? ? {} : {'by' => by.to_s}
89
+
82
90
  connection.get("ads/#{id}/recent/#{statistic}", parameters)
83
91
  end
84
92
 
@@ -95,7 +95,12 @@ module Neuron
95
95
  # data : the serializable object that should match the given schema
96
96
  def validate_against_schema!(schema_name, data)
97
97
  if validate? && data.present?
98
- JSON::Validator.validate!(schema.send(schema_name), data)
98
+ begin
99
+ JSON::Validator.validate!(schema.send(schema_name), data)
100
+ rescue Exception => e
101
+ e.message << "\nSchema: #{schema.class.name}::SCHEMA.#{schema_name}\nData: #{data.inspect}"
102
+ raise e
103
+ end
99
104
  end
100
105
  end
101
106
 
@@ -11,7 +11,14 @@ module Neuron
11
11
  VAST = "Vast"
12
12
  RESPONSE_TYPES = [REDIRECT, IRIS, VAST]
13
13
 
14
- TEMPLATE_SLUGS = ["300x250", "300x600"]
14
+ IRIS_2_0 = '2_0'
15
+ IRIS_2_5 = '2_5'
16
+ IRIS_VERSIONS = [IRIS_2_0, IRIS_2_5]
17
+ TEMPLATE_SLUGS = ['300x250']
18
+ PLAYLIST_MODES = ['MAXI', 'MINI']
19
+ PLAYBACK_MODE_OPTIONS = [['Auto Play', 'AUTO'], ['Click To Play','CTP'], ['Rollover To Play', 'RTP']]
20
+ PLAYBACK_MODES = Hash[PLAYBACK_MODE_OPTIONS].values
21
+ OVERLAY_PROVIDERS = ['NAMI', 'PREDICTV']
15
22
 
16
23
  ATTRIBUTES = [
17
24
  :id,
@@ -19,12 +26,20 @@ module Neuron
19
26
  :name,
20
27
  :response_type, # string in RESPONSE_TYPES
21
28
  :template_slug, # nil, or string in TEMPLATE_SLUGS
22
- :mute, # nil, or "Yes" or "No"
23
- :autoplay, # nil, or "Yes" or "No"
24
29
  :channel, # nil, or slug
25
30
  :expand, # nil, or "Yes" or "No"
26
- :text_overlay, # nil, or "Yes" or "No"
27
- :nami_feed_url, # nil, or string URL
31
+ :iris_version, # nil, or string in IRIS_VERSIONS
32
+ # Iris 2.0
33
+ :mute, # nil, or "Yes" or "No"
34
+ :autoplay, # nil, or "Yes" or "No"
35
+ # Iris 2.5
36
+ :playlist_mode, # nil, or string in PLAYLIST_MODES
37
+ :volume, # nil, or 1-100s
38
+ :color, # nil, or string (hex color - '333333')
39
+ :playback_mode, # nil, or string in PLAYBACK_MODES
40
+ :overlay_provider, # nil, or string in OVERLAY_PROVIDERS
41
+ :overlay_feed_url, # nil, or string URL
42
+
28
43
  :created_at, # string, datetime in UTC
29
44
  :updated_at, # string, datetime in UTC
30
45
  ]
@@ -13,7 +13,7 @@ module Neuron
13
13
  def validate!(schema_name, data)
14
14
  JSON::Validator.validate!(schema.send(schema_name), data)
15
15
  rescue Exception => e
16
- puts "Data: #{data}"
16
+ e.message << "\nSchema: #{schema.class.name}::SCHEMA.#{schema_name}\nData: #{data.inspect}"
17
17
  raise e
18
18
  end
19
19
  end
@@ -17,7 +17,8 @@ module Neuron
17
17
  @@create ||=
18
18
  one_of(
19
19
  create_redirect,
20
- create_iris,
20
+ create_iris_2_0,
21
+ create_iris_2_5,
21
22
  create_vast
22
23
  )
23
24
  end
@@ -26,7 +27,8 @@ module Neuron
26
27
  @@show ||=
27
28
  one_of(
28
29
  show_redirect,
29
- show_iris,
30
+ show_iris_2_0,
31
+ show_iris_2_5,
30
32
  show_vast
31
33
  )
32
34
  end
@@ -35,7 +37,8 @@ module Neuron
35
37
  @@update ||=
36
38
  one_of(
37
39
  update_redirect,
38
- update_iris,
40
+ update_iris_2_0,
41
+ update_iris_2_5,
39
42
  update_vast
40
43
  )
41
44
  end
@@ -49,17 +52,33 @@ module Neuron
49
52
  }))
50
53
  end
51
54
 
52
- def create_iris
53
- @@create_iris ||=
55
+ def create_iris_2_0
56
+ @@create_iris_2_0 ||=
54
57
  object_type("zone", merged(CREATE_PROPERTIES,{
55
58
  :response_type => SCHEMA.choice_of([Neuron::Client::Zone::IRIS]),
59
+ :iris_version => SCHEMA.choice_of([Neuron::Client::Zone::IRIS_2_0], :required => false),
56
60
  :template_slug => SCHEMA.choice_of(Neuron::Client::Zone::TEMPLATE_SLUGS),
57
- :mute => SCHEMA.yes_no,
58
- :autoplay => SCHEMA.yes_no,
59
61
  :channel => SCHEMA.channel,
60
62
  :expand => SCHEMA.yes_no,
61
- :text_overlay => SCHEMA.yes_no,
62
- :nami_feed_url => SCHEMA.url(:type => %w(string null), :required => false)
63
+ :mute => SCHEMA.yes_no,
64
+ :autoplay => SCHEMA.yes_no
65
+ }))
66
+ end
67
+
68
+ def create_iris_2_5
69
+ @@create_iris_2_5 ||=
70
+ object_type("zone", merged(CREATE_PROPERTIES,{
71
+ :response_type => SCHEMA.choice_of([Neuron::Client::Zone::IRIS]),
72
+ :iris_version => SCHEMA.choice_of([Neuron::Client::Zone::IRIS_2_5]),
73
+ :template_slug => SCHEMA.choice_of(Neuron::Client::Zone::TEMPLATE_SLUGS),
74
+ :channel => SCHEMA.channel,
75
+ :expand => SCHEMA.yes_no,
76
+ :playlist_mode => SCHEMA.playlist_mode,
77
+ :volume => SCHEMA.volume,
78
+ :color => SCHEMA.color(:required => false),
79
+ :playback_mode => SCHEMA.playback_mode,
80
+ :overlay_provider => SCHEMA.overlay_provider(:required => false),
81
+ :overlay_feed_url => SCHEMA.url(:type => %w(null string), :required => false)
63
82
  }))
64
83
  end
65
84
 
@@ -77,17 +96,33 @@ module Neuron
77
96
  }))
78
97
  end
79
98
 
80
- def show_iris
81
- @@show_iris ||=
99
+ def show_iris_2_0
100
+ @@show_iris_2_0 ||=
82
101
  object_type("zone", merged(SHOW_PROPERTIES,{
83
102
  :response_type => SCHEMA.choice_of([Neuron::Client::Zone::IRIS]),
103
+ :iris_version => SCHEMA.choice_of([Neuron::Client::Zone::IRIS_2_0], :required => false),
84
104
  :template_slug => SCHEMA.choice_of(Neuron::Client::Zone::TEMPLATE_SLUGS),
85
- :mute => SCHEMA.yes_no,
86
- :autoplay => SCHEMA.yes_no,
87
105
  :channel => SCHEMA.channel,
88
106
  :expand => SCHEMA.yes_no,
89
- :text_overlay => SCHEMA.yes_no,
90
- :nami_feed_url => SCHEMA.url(:type => %w(string null))
107
+ :mute => SCHEMA.yes_no,
108
+ :autoplay => SCHEMA.yes_no
109
+ }))
110
+ end
111
+
112
+ def show_iris_2_5
113
+ @@show_iris_2_5 ||=
114
+ object_type("zone", merged(SHOW_PROPERTIES,{
115
+ :response_type => SCHEMA.choice_of([Neuron::Client::Zone::IRIS]),
116
+ :iris_version => SCHEMA.choice_of([Neuron::Client::Zone::IRIS_2_5]),
117
+ :template_slug => SCHEMA.choice_of(Neuron::Client::Zone::TEMPLATE_SLUGS),
118
+ :channel => SCHEMA.channel,
119
+ :expand => SCHEMA.yes_no,
120
+ :playlist_mode => SCHEMA.playlist_mode,
121
+ :volume => SCHEMA.volume,
122
+ :color => SCHEMA.color,
123
+ :playback_mode => SCHEMA.playback_mode,
124
+ :overlay_provider => SCHEMA.overlay_provider,
125
+ :overlay_feed_url => SCHEMA.url(:type => %w(null string))
91
126
  }))
92
127
  end
93
128
 
@@ -105,17 +140,33 @@ module Neuron
105
140
  }))
106
141
  end
107
142
 
108
- def update_iris
109
- @@update_iris ||=
143
+ def update_iris_2_0
144
+ @@update_iris_2_0 ||=
110
145
  object_type("zone", merged(UPDATE_PROPERTIES,{
111
146
  :response_type => SCHEMA.choice_of([Neuron::Client::Zone::IRIS], :required => false),
147
+ :iris_version => SCHEMA.choice_of([Neuron::Client::Zone::IRIS_2_0], :required => false),
112
148
  :template_slug => SCHEMA.choice_of(Neuron::Client::Zone::TEMPLATE_SLUGS, :required => false),
113
- :mute => SCHEMA.yes_no(:required => false),
114
- :autoplay => SCHEMA.yes_no(:required => false),
115
149
  :channel => SCHEMA.channel(:required => false),
116
150
  :expand => SCHEMA.yes_no(:required => false),
117
- :text_overlay => SCHEMA.yes_no(:required => false),
118
- :nami_feed_url => SCHEMA.url(:type => %w(string null), :required => false)
151
+ :mute => SCHEMA.yes_no(:required => false),
152
+ :autoplay => SCHEMA.yes_no(:required => false)
153
+ }))
154
+ end
155
+
156
+ def update_iris_2_5
157
+ @@update_iris_2_5 ||=
158
+ object_type("zone", merged(UPDATE_PROPERTIES,{
159
+ :response_type => SCHEMA.choice_of([Neuron::Client::Zone::IRIS], :required => false),
160
+ :iris_version => SCHEMA.choice_of([Neuron::Client::Zone::IRIS_2_5], :required => false),
161
+ :template_slug => SCHEMA.choice_of(Neuron::Client::Zone::TEMPLATE_SLUGS, :required => false),
162
+ :channel => SCHEMA.channel(:required => false),
163
+ :expand => SCHEMA.yes_no(:required => false),
164
+ :playlist_mode => SCHEMA.playlist_mode(:required => false),
165
+ :volume => SCHEMA.volume(:required => false),
166
+ :color => SCHEMA.color(:required => false),
167
+ :playback_mode => SCHEMA.playback_mode(:required => false),
168
+ :overlay_provider => SCHEMA.overlay_provider(:required => false),
169
+ :overlay_feed_url => SCHEMA.url(:type => %w(null string), :required => false)
119
170
  }))
120
171
  end
121
172
 
@@ -157,23 +208,63 @@ module Neuron
157
208
  }, overrides)
158
209
  end
159
210
 
211
+ def color(overrides={})
212
+ merged({
213
+ :type => %w(string null),
214
+ :format => "color",
215
+ :required => true
216
+ }, overrides)
217
+ end
218
+
219
+ def overlay_provider(overrides={})
220
+ choice_of(Neuron::Client::Zone::OVERLAY_PROVIDERS, overrides)
221
+ end
222
+
223
+ def playback_mode(overrides={})
224
+ choice_of(Neuron::Client::Zone::PLAYBACK_MODES, overrides)
225
+ end
226
+
227
+ def playlist_mode(overrides={})
228
+ choice_of(Neuron::Client::Zone::PLAYLIST_MODES, overrides)
229
+ end
230
+
231
+ def volume(overrides={})
232
+ merged({
233
+ :type => %w(integer string null),
234
+ :required => true,
235
+ :minimum => 0,
236
+ :exclusiveMinimum => false,
237
+ :maximum => 100,
238
+ :exclusiveMaximum => false,
239
+ :pattern => "^[0-9]\\d+$",
240
+ :maxLength => 3
241
+ }, overrides)
242
+ end
243
+
160
244
  # --------------------
161
245
 
162
246
  private
163
247
 
164
-
165
248
  CREATE_PROPERTIES =
166
249
  {
167
250
  :name => SCHEMA.nullable_string(:required => false),
168
251
  :ad_links => SCHEMA.ad_links(:required => false),
169
252
  :response_type => SCHEMA.choice_of([], :required => true),
253
+ :iris_version => SCHEMA.missing_or_null,
170
254
  :template_slug => SCHEMA.missing_or_null,
171
- :mute => SCHEMA.missing_or_null,
172
- :autoplay => SCHEMA.missing_or_null,
173
255
  :channel => SCHEMA.missing_or_null,
174
256
  :expand => SCHEMA.missing_or_null,
175
- :text_overlay => SCHEMA.missing_or_null,
176
- :nami_feed_url => SCHEMA.missing_or_null,
257
+ # Iris 2.0
258
+ :mute => SCHEMA.missing_or_null,
259
+ :autoplay => SCHEMA.missing_or_null,
260
+ # Iris 2.5
261
+ :playlist_mode => SCHEMA.missing_or_null,
262
+ :volume => SCHEMA.missing_or_null,
263
+ :color => SCHEMA.missing_or_null,
264
+ :playback_mode => SCHEMA.missing_or_null,
265
+ :overlay_provider => SCHEMA.missing_or_null,
266
+ :overlay_feed_url => SCHEMA.missing_or_null,
267
+
177
268
  }
178
269
 
179
270
  SHOW_PROPERTIES =
@@ -185,13 +276,20 @@ module Neuron
185
276
  :name => SCHEMA.nullable_string(:required => true),
186
277
  :ad_links => SCHEMA.ad_links(:required => true),
187
278
  :response_type => SCHEMA.choice_of([], :required => true),
279
+ :iris_version => SCHEMA.missing_or_null,
188
280
  :template_slug => SCHEMA.missing_or_null,
189
- :mute => SCHEMA.missing_or_null,
190
- :autoplay => SCHEMA.missing_or_null,
191
281
  :channel => SCHEMA.missing_or_null,
192
282
  :expand => SCHEMA.missing_or_null,
193
- :text_overlay => SCHEMA.missing_or_null,
194
- :nami_feed_url => SCHEMA.missing_or_null,
283
+ # Iris 2.0
284
+ :mute => SCHEMA.missing_or_null,
285
+ :autoplay => SCHEMA.missing_or_null,
286
+ # Iris 2.5
287
+ :playlist_mode => SCHEMA.missing_or_null,
288
+ :volume => SCHEMA.missing_or_null,
289
+ :color => SCHEMA.missing_or_null,
290
+ :playback_mode => SCHEMA.missing_or_null,
291
+ :overlay_provider => SCHEMA.missing_or_null,
292
+ :overlay_feed_url => SCHEMA.missing_or_null,
195
293
  }
196
294
 
197
295
  UPDATE_PROPERTIES =
@@ -201,13 +299,20 @@ module Neuron
201
299
  :name => SCHEMA.nullable_string(:required => false),
202
300
  :ad_links => SCHEMA.ad_links(:required => false),
203
301
  :response_type => SCHEMA.choice_of([], :required => false),
302
+ :iris_version => SCHEMA.missing_or_null,
204
303
  :template_slug => SCHEMA.missing_or_null,
205
- :mute => SCHEMA.missing_or_null,
206
- :autoplay => SCHEMA.missing_or_null,
207
304
  :channel => SCHEMA.missing_or_null,
208
305
  :expand => SCHEMA.missing_or_null,
209
- :text_overlay => SCHEMA.missing_or_null,
210
- :nami_feed_url => SCHEMA.missing_or_null,
306
+ # Iris 2.0
307
+ :mute => SCHEMA.missing_or_null,
308
+ :autoplay => SCHEMA.missing_or_null,
309
+ # Iris 2.5
310
+ :playlist_mode => SCHEMA.missing_or_null,
311
+ :volume => SCHEMA.missing_or_null,
312
+ :color => SCHEMA.missing_or_null,
313
+ :playback_mode => SCHEMA.missing_or_null,
314
+ :overlay_provider => SCHEMA.missing_or_null,
315
+ :overlay_feed_url => SCHEMA.missing_or_null,
211
316
  }
212
317
  end
213
318
  end
@@ -1,5 +1,5 @@
1
1
  module Neuron
2
2
  module Client
3
- VERSION = "0.3.0"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
@@ -178,7 +178,7 @@ module Neuron
178
178
  ad = Ad.new(@minimal_attributes.merge('id' => 7))
179
179
  @connection.should_receive(:get).with('ads/7/recent/impressions', {'by' => 'zone'}).and_return('return_value')
180
180
 
181
- ad.recent('impressions', 'zone').should == 'return_value'
181
+ ad.recent('impressions', :by => 'zone').should == 'return_value'
182
182
  end
183
183
  end
184
184
 
@@ -4,16 +4,21 @@ module Neuron
4
4
  before(:each) do
5
5
  @datetime = "2011-11-11T11:11:11Z"
6
6
  @minimal_attributes = {
7
- 'ad_links' => nil,
8
- 'name' => nil,
9
- 'response_type' => nil,
10
- 'template_slug' => nil,
11
- 'mute' => nil,
12
- 'autoplay' => nil,
13
- 'channel' => nil,
14
- 'expand' => nil,
15
- 'text_overlay' => nil,
16
- 'nami_feed_url' => nil,
7
+ 'ad_links' => nil,
8
+ 'name' => nil,
9
+ 'response_type' => nil,
10
+ 'iris_version' => nil,
11
+ 'template_slug' => nil,
12
+ 'mute' => nil,
13
+ 'autoplay' => nil,
14
+ 'channel' => nil,
15
+ 'expand' => nil,
16
+ 'playlist_mode' => nil,
17
+ 'volume' => nil,
18
+ 'color' => nil,
19
+ 'playback_mode' => nil,
20
+ 'overlay_provider' => nil,
21
+ 'overlay_feed_url' => nil,
17
22
  }
18
23
  end
19
24
  context "when connected to the admin server" do
@@ -58,7 +58,7 @@ module Neuron
58
58
  }}, :against => Zone::SCHEMA.create)
59
59
  end
60
60
 
61
- it "should approve an example iris zone" do
61
+ it "should approve an example iris 2.0 zone" do
62
62
  validate({"zone" => {
63
63
  "name" => "example_iris_zone",
64
64
  "response_type" => "Iris",
@@ -67,9 +67,23 @@ module Neuron
67
67
  "mute" => "No",
68
68
  "autoplay" => "Yes",
69
69
  "channel" => "drivel",
70
+ "template_slug" => "300x250"
71
+ }}, :against => Zone::SCHEMA.create)
72
+ end
73
+
74
+ it "should approve an example iris 2.5 zone" do
75
+ validate({"zone" => {
76
+ "name" => "example_iris_zone",
77
+ "response_type" => "Iris",
78
+ "ad_links" => {},
79
+ "expand" => "Yes",
80
+ "channel" => "drivel",
70
81
  "template_slug" => "300x250",
71
- "text_overlay" => "Yes",
72
- "nami_feed_url" => "http://example.com/"
82
+ "playlist_mode" => "MAXI",
83
+ "playback_mode" => "AUTO",
84
+ "volume" => "10",
85
+ "color" => "#FF0000",
86
+ "iris_version" => "2_5"
73
87
  }}, :against => Zone::SCHEMA.create)
74
88
  end
75
89
 
@@ -118,7 +132,7 @@ module Neuron
118
132
  }}, :against => Zone::SCHEMA.show)
119
133
  end
120
134
 
121
- it "should approve an example iris zone" do
135
+ it "should approve an example iris 2.0 zone" do
122
136
  validate({"zone" => {
123
137
  "name" => "example_iris_zone",
124
138
  "response_type" => "Iris",
@@ -128,8 +142,27 @@ module Neuron
128
142
  "autoplay" => "Yes",
129
143
  "channel" => "drivel",
130
144
  "template_slug" => "300x250",
131
- "text_overlay" => "No",
132
- "nami_feed_url" => nil,
145
+ "created_at" => @datetime,
146
+ "updated_at" => @datetime,
147
+ "id" => "abc123"
148
+ }}, :against => Zone::SCHEMA.show)
149
+ end
150
+
151
+ it "should approve an example iris 2.5 zone" do
152
+ validate({"zone" => {
153
+ "name" => "example_iris_zone",
154
+ "response_type" => "Iris",
155
+ "ad_links" => {},
156
+ "expand" => "Yes",
157
+ "channel" => "drivel",
158
+ "template_slug" => "300x250",
159
+ "playlist_mode" => "MAXI",
160
+ "playback_mode" => "AUTO",
161
+ "volume" => "10",
162
+ "color" => "#FF0000",
163
+ "overlay_provider" => "NAMI",
164
+ "overlay_feed_url" => "http://example.com/",
165
+ "iris_version" => "2_5",
133
166
  "created_at" => @datetime,
134
167
  "updated_at" => @datetime,
135
168
  "id" => "abc123"
@@ -188,7 +221,7 @@ module Neuron
188
221
  }}, :against => Zone::SCHEMA.update)
189
222
  end
190
223
 
191
- it "should approve an example iris zone" do
224
+ it "should approve an example iris 2.0 zone" do
192
225
  validate({"zone" => {
193
226
  "name" => "example_iris_zone",
194
227
  "response_type" => "Iris",
@@ -197,13 +230,30 @@ module Neuron
197
230
  "mute" => "No",
198
231
  "autoplay" => "Yes",
199
232
  "channel" => "drivel",
200
- "text_overlay" => "No",
201
- "nami_feed_url" => nil,
202
233
  "template_slug" => "300x250",
203
234
  "id" => "abc123"
204
235
  }}, :against => Zone::SCHEMA.update)
205
236
  end
206
237
 
238
+ it "should approve an example iris 2.5 zone" do
239
+ validate({"zone" => {
240
+ "name" => "example_iris_zone",
241
+ "response_type" => "Iris",
242
+ "ad_links" => {},
243
+ "expand" => "Yes",
244
+ "channel" => "drivel",
245
+ "template_slug" => "300x250",
246
+ "playlist_mode" => "MAXI",
247
+ "playback_mode" => "AUTO",
248
+ "volume" => "10",
249
+ "color" => "#FF0000",
250
+ "overlay_provider" => "NAMI",
251
+ "overlay_feed_url" => "http://example.com/",
252
+ "iris_version" => "2_5",
253
+ "id" => "abc123"
254
+ }}, :against => Zone::SCHEMA.update)
255
+ end
256
+
207
257
  it "should approve an example vast zone" do
208
258
  validate({"zone" => {
209
259
  "name" => "example vast zone",
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neuron-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
8
+ - 4
9
9
  - 0
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - RMM Online
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-11 00:00:00 Z
18
+ date: 2012-01-31 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rest-client