restful_resource 2.0.2 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 82a879953f0ea77b78d0d10e389f71c52b871478
4
- data.tar.gz: 58780ad094d558ac4fcc2a132c3df4405449b252
3
+ metadata.gz: 78cdc6fe007f825644ca02011bd4331d3d5f2087
4
+ data.tar.gz: dd4d619d9d2f4a0e020824de651f58a5f339cf84
5
5
  SHA512:
6
- metadata.gz: 5a7514ee216cd7f0d65844ce0f2e40f545792b61c0272b5249a089b4cb2c8564a01b83fcedb0df47e197ecd7d228957d615477c482921e42c4936ca0c51bfac1
7
- data.tar.gz: 2e71dc51a9751ae363e9aa840f513196d704fcda064133a5ba86eac3fc64fcd7b1ce9abe8c968d46fb0a73e5a53ae78e3f8f8ff15dbc5adec5203e25f1adf6ce
6
+ metadata.gz: 4876da8d8cd7a11501035d975e7511d1481d19c2f40a5423c9c10fbb5331ed963da3607461003677df03f8e138375584a8a9c86a0086a029f3365553f870befe
7
+ data.tar.gz: eb793fe38f0e1fdddf30f49d695b5bd9cf05e92cc74a7ed16a8651d624655137d75480650b5662cbc01a37d2561f789daebc997b92da8e0b6354afb6a426245e
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ v2.1.0
4
+ ---
5
+
6
+ - Add `open_timeout` and `timeout` options to `Base.configure` and all request methods
7
+
3
8
  v1.6.0
4
9
  ---
5
10
  - group ServiceUnavailable, Timeout, and ClientError as subclasses of RetryableError
@@ -4,6 +4,7 @@ require 'link_header'
4
4
  require 'faraday'
5
5
  require 'faraday_middleware'
6
6
  require 'faraday-http-cache'
7
+ require 'faraday_cdn_metrics'
7
8
  require 'faraday/encoding'
8
9
  require 'active_support'
9
10
  require 'active_support/all'
@@ -23,44 +23,50 @@ module RestfulResource
23
23
  end
24
24
 
25
25
  def self.find(id, params={})
26
- params_without_headers, headers = extract_headers!(params)
26
+ params_without_options, options = format_params(params)
27
27
 
28
- response = http.get(member_url(id, params_without_headers), headers: headers)
28
+ response = http.get(member_url(id, params_without_options), **options)
29
29
  self.new(parse_json(response.body))
30
30
  end
31
31
 
32
32
  def self.where(params={})
33
- params_without_headers, headers = extract_headers!(params)
33
+ params_without_options, options = format_params(params)
34
34
 
35
- url = collection_url(params_without_headers)
36
- response = http.get(url, headers: headers)
35
+ url = collection_url(params_without_options)
36
+ response = http.get(url, **options)
37
37
  self.paginate_response(response)
38
38
  end
39
39
 
40
40
  def self.get(params = {})
41
- params_without_headers, headers = extract_headers!(params)
41
+ params_without_options, options = format_params(params)
42
42
 
43
- response = http.get(collection_url(params_without_headers), headers: headers)
43
+ response = http.get(collection_url(params_without_options), **options)
44
44
  self.new(parse_json(response.body))
45
45
  end
46
46
 
47
47
  def self.delete(id, **params)
48
- headers = params.delete(:headers) || {}
49
-
50
- response = http.delete(member_url(id, params), headers: headers)
48
+ params_without_options, options = format_params(params)
49
+ response = http.delete(member_url(id, params_without_options), **options)
51
50
  RestfulResource::OpenObject.new(parse_json(response.body))
52
51
  end
53
52
 
54
53
  def self.put(id, data: {}, headers: {}, **params)
55
- url = member_url(id, params)
56
- response = http.put(url, data: data, headers: headers)
54
+ params_without_options, options = format_params(params)
55
+ options.delete(:headers)
56
+
57
+ url = member_url(id, params_without_options)
58
+
59
+ response = http.put(url, data: data, headers: headers, **options)
57
60
  self.new(parse_json(response.body))
58
61
  end
59
62
 
60
63
  def self.post(data: {}, headers: {}, **params)
61
- url = collection_url(params)
64
+ params_without_options, options = format_params(params)
65
+ options.delete(:headers)
66
+
67
+ url = collection_url(params_without_options)
62
68
 
63
- response = http.post(url, data: data, headers: headers)
69
+ response = http.post(url, data: data, headers: headers, **options)
64
70
 
65
71
  self.new(parse_json(response.body))
66
72
  end
@@ -113,12 +119,14 @@ module RestfulResource
113
119
 
114
120
  private
115
121
 
116
- def self.extract_headers!(params = {})
122
+ def self.format_params(params = {})
117
123
  headers = params.delete(:headers) || {}
118
124
 
119
125
  headers.merge!(cache_control: 'no-cache') if params.delete(:no_cache)
126
+ open_timeout = params.delete(:open_timeout)
127
+ timeout = params.delete(:timeout)
120
128
 
121
- [params, headers]
129
+ [params, headers: headers, open_timeout: open_timeout, timeout: timeout]
122
130
  end
123
131
 
124
132
  def self.merge_url_paths(uri, *paths)
@@ -65,15 +65,21 @@ module RestfulResource
65
65
  logger: nil,
66
66
  cache_store: nil,
67
67
  connection: nil,
68
- instrumentation: {})
69
-
70
-
71
- api_name = instrumentation[:api_name] ||= 'api'
72
- instrumentation[:request_instrument_name] ||= "http.#{api_name}"
73
- instrumentation[:cache_instrument_name] ||= "http_cache.#{api_name}"
68
+ instrumentation: {},
69
+ open_timeout: 2,
70
+ timeout: 10)
71
+ api_name = instrumentation[:api_name] ||= 'api'
72
+ instrumentation[:request_instrument_name] ||= "http.#{api_name}"
73
+ instrumentation[:cache_instrument_name] ||= "http_cache.#{api_name}"
74
+ instrumentation[:server_cache_instrument_name] ||= "cdn_metrics.#{api_name}"
74
75
 
75
76
  if instrumentation[:metric_class]
76
- @metrics = Instrumentation.new(instrumentation.slice(:app_name, :api_name, :request_instrument_name, :cache_instrument_name, :metric_class))
77
+ @metrics = Instrumentation.new(instrumentation.slice(:app_name,
78
+ :api_name,
79
+ :request_instrument_name,
80
+ :cache_instrument_name,
81
+ :server_cache_instrument_name,
82
+ :metric_class))
77
83
  @metrics.subscribe_to_notifications
78
84
  end
79
85
 
@@ -82,36 +88,74 @@ module RestfulResource
82
88
  cache_store: cache_store,
83
89
  instrumenter: ActiveSupport::Notifications,
84
90
  request_instrument_name: instrumentation.fetch(:request_instrument_name, nil),
85
- cache_instrument_name: instrumentation.fetch(:cache_instrument_name, nil))
91
+ cache_instrument_name: instrumentation.fetch(:cache_instrument_name, nil),
92
+ server_cache_instrument_name: instrumentation.fetch(:server_cache_instrument_name, nil))
86
93
 
87
- if username && password
88
- @connection.basic_auth username, password
89
- end
94
+ @connection.basic_auth(username, password) if username && password
95
+ @default_open_timeout = open_timeout
96
+ @default_timeout = timeout
90
97
  end
91
98
 
92
- def get(url, headers: {})
93
- http_request(Request.new(:get, url, headers: headers))
99
+ def get(url, headers: {}, open_timeout: nil, timeout: nil)
100
+ http_request(
101
+ Request.new(
102
+ :get,
103
+ url,
104
+ headers: headers,
105
+ open_timeout: open_timeout,
106
+ timeout: timeout
107
+ )
108
+ )
94
109
  end
95
110
 
96
- def delete(url, headers: {})
97
- http_request(Request.new(:delete, url, headers: headers))
111
+ def delete(url, headers: {}, open_timeout: nil, timeout: nil)
112
+ http_request(
113
+ Request.new(
114
+ :delete,
115
+ url,
116
+ headers: headers,
117
+ open_timeout: open_timeout,
118
+ timeout: timeout
119
+ )
120
+ )
98
121
  end
99
122
 
100
- def put(url, data: {}, headers: {})
101
- http_request(Request.new(:put, url, body: data, headers: headers))
123
+ def put(url, data: {}, headers: {}, open_timeout: nil, timeout: nil)
124
+ http_request(
125
+ Request.new(
126
+ :put,
127
+ url,
128
+ body: data,
129
+ headers: headers,
130
+ open_timeout: open_timeout,
131
+ timeout: timeout
132
+ )
133
+ )
102
134
  end
103
135
 
104
- def post(url, data: {}, headers: {})
105
- http_request(Request.new(:post, url, body: data, headers: headers))
136
+ def post(url, data: {}, headers: {}, open_timeout: nil, timeout: nil)
137
+ http_request(
138
+ Request.new(
139
+ :post,
140
+ url,
141
+ body: data,
142
+ headers: headers,
143
+ open_timeout: open_timeout,
144
+ timeout: timeout
145
+ )
146
+ )
106
147
  end
107
148
 
108
149
  private
109
150
 
151
+ attr_reader :default_open_timeout, :default_timeout
152
+
110
153
  def initialize_connection(logger: nil,
111
154
  cache_store: nil,
112
155
  instrumenter: nil,
113
156
  request_instrument_name: nil,
114
- cache_instrument_name: nil)
157
+ cache_instrument_name: nil,
158
+ server_cache_instrument_name: nil)
115
159
 
116
160
  @connection = Faraday.new do |b|
117
161
  b.request :json
@@ -121,6 +165,11 @@ module RestfulResource
121
165
  b.response :logger, logger
122
166
  end
123
167
 
168
+ if server_cache_instrument_name
169
+ b.use :cdn_metrics, instrumenter: instrumenter,
170
+ instrument_name: server_cache_instrument_name
171
+ end
172
+
124
173
  if cache_store
125
174
  b.use :http_cache, store: cache_store,
126
175
  logger: logger,
@@ -141,8 +190,8 @@ module RestfulResource
141
190
 
142
191
  def http_request(request)
143
192
  response = @connection.send(request.method) do |req|
144
- req.options.open_timeout = 2 # seconds
145
- req.options.timeout = 10 # seconds
193
+ req.options.open_timeout = request.open_timeout || default_open_timeout # seconds
194
+ req.options.timeout = request.timeout || default_timeout # seconds
146
195
 
147
196
  req.body = request.body unless request.body.nil?
148
197
  req.url request.url
@@ -3,15 +3,17 @@ require 'active_support/notifications'
3
3
  module RestfulResource
4
4
  class Instrumentation
5
5
 
6
- def initialize(app_name:, api_name:, request_instrument_name:, cache_instrument_name:, metric_class:)
6
+ def initialize(app_name:, api_name:, request_instrument_name:, cache_instrument_name:, server_cache_instrument_name:, metric_class:)
7
7
  @app_name = app_name
8
8
  @api_name = api_name
9
9
  @request_instrument_name = request_instrument_name
10
10
  @cache_instrument_name = cache_instrument_name
11
+ @server_cache_instrument_name = server_cache_instrument_name
11
12
  @metric_class = metric_class
12
13
  end
13
14
 
14
- attr_reader :app_name, :api_name, :request_instrument_name, :cache_instrument_name, :metric_class
15
+ attr_reader :app_name, :api_name, :request_instrument_name, :cache_instrument_name,
16
+ :server_cache_instrument_name, :metric_class
15
17
 
16
18
  def subscribe_to_notifications
17
19
  validate_metric_class!
@@ -62,6 +64,39 @@ module RestfulResource
62
64
  metric_class.count cache_notifier_namespace(metric: 'cache_bypass', event: event), 1
63
65
  end
64
66
  end
67
+
68
+ # Subscribes to events from Faraday::Cdn::Metrics
69
+ ActiveSupport::Notifications.subscribe server_cache_instrument_name do |*args|
70
+ event = ActiveSupport::Notifications::Event.new(*args)
71
+ client_cache_status = event.payload.fetch(:client_cache_status, nil)
72
+ server_cache_status = event.payload.fetch(:server_cache_status, nil)
73
+
74
+ if client_cache_status.nil? || !client_cache_status.in?([:fresh, :valid])
75
+ # Outputs log lines like:
76
+ # count#quotes_site.research_site_api.server_cache_hit=1
77
+ # count#quotes_site.research_site_api.api_v2_cap_derivatives.server_cache_hit=1
78
+ case server_cache_status
79
+ when :fresh
80
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_hit'), 1
81
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_hit', event: event), 1
82
+ when :valid
83
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_hit_while_revalidate'), 1
84
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_hit_while_revalidate', event: event), 1
85
+ when :invalid, :miss
86
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_miss'), 1
87
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_miss', event: event), 1
88
+ when :unacceptable
89
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_not_cacheable'), 1
90
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_not_cacheable', event: event), 1
91
+ when :bypass
92
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_bypass'), 1
93
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_bypass', event: event), 1
94
+ when :unknown
95
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_unknown'), 1
96
+ metric_class.count cache_notifier_namespace(metric: 'server_cache_unknown', event: event), 1
97
+ end
98
+ end
99
+ end
65
100
  end
66
101
 
67
102
  def validate_metric_class!
@@ -75,9 +110,9 @@ module RestfulResource
75
110
  [app_name, api_name, base_request_path(event), metric].compact.join('.')
76
111
  end
77
112
 
78
- # Converts a path like "/api/v2/cap_derivatives/75423" to "api_v2_cap_derivatives"
113
+ # Converts a path like "/api/v2/cap_derivatives/75423/with_colours" to "api_v2_cap_derivatives_with_colours"
79
114
  def base_request_path(event)
80
- path_from_event(event).split('/').drop(1).take(3).join('_') if event
115
+ path_from_event(event).split('/').drop(1).select {|a| a.match(/\d+/).nil? }.join('_') if event
81
116
  end
82
117
 
83
118
  def path_from_event(event)
@@ -93,4 +128,3 @@ module RestfulResource
93
128
  end
94
129
  end
95
130
  end
96
-
@@ -1,48 +1,41 @@
1
1
  module RestfulResource
2
2
  module RailsValidations
3
3
  module ClassMethods
4
- def put(id, data: {}, headers: {}, **params)
5
- begin
6
- super(id, data: data, headers: {}, **params)
7
- rescue HttpClient::UnprocessableEntity => e
8
- errors = parse_json(e.response.body)
9
- result = nil
10
- if errors.is_a?(Hash) && errors.has_key?('errors')
11
- result = data.merge(errors)
12
- else
13
- result = data.merge(errors: errors)
14
- end
15
- result = result.merge(id: id)
16
- self.new(result)
4
+ def put(id, data: {}, **)
5
+ super
6
+ rescue HttpClient::UnprocessableEntity => e
7
+ errors = parse_json(e.response.body)
8
+ result = nil
9
+ if errors.is_a?(Hash) && errors.has_key?('errors')
10
+ result = data.merge(errors)
11
+ else
12
+ result = data.merge(errors: errors)
17
13
  end
14
+ result = result.merge(id: id)
15
+ self.new(result)
18
16
  end
19
17
 
20
- def post(data: {}, headers: {}, **params)
21
- with_validations(data: data) do
22
- super(data: data, headers: {}, **params)
23
- end
18
+ def post(data: {}, **)
19
+ with_validations(data: data) { super }
24
20
  end
25
21
 
26
- def get(params = {})
27
- with_validations do
28
- super(params)
29
- end
22
+ def get(*)
23
+ with_validations { super }
30
24
  end
31
25
 
32
26
  private
33
- def with_validations(data: {}, &block)
34
- begin
35
- block.call
36
- rescue HttpClient::UnprocessableEntity => e
37
- errors = parse_json(e.response.body)
38
- result = nil
39
- if errors.is_a?(Hash) && errors.has_key?('errors')
40
- result = data.merge(errors)
41
- else
42
- result = data.merge(errors: errors)
43
- end
44
- self.new(result)
27
+
28
+ def with_validations(data: {})
29
+ yield
30
+ rescue HttpClient::UnprocessableEntity => e
31
+ errors = parse_json(e.response.body)
32
+ result = nil
33
+ if errors.is_a?(Hash) && errors.has_key?('errors')
34
+ result = data.merge(errors)
35
+ else
36
+ result = data.merge(errors: errors)
45
37
  end
38
+ self.new(result)
46
39
  end
47
40
  end
48
41
 
@@ -8,10 +8,10 @@ module RestfulResource
8
8
  module Redirections
9
9
  def self.included(base)
10
10
  base.instance_eval do
11
- def post(data: {}, delay: 1.0, max_attempts: 10, headers: {}, **params)
11
+ def post(data: {}, delay: 1.0, max_attempts: 10, headers: {}, open_timeout: nil, timeout: nil, **params)
12
12
  url = collection_url(params)
13
13
 
14
- response = self.accept_redirected_result(response: http.post(url, data: data, headers: headers), delay: delay, max_attempts: max_attempts)
14
+ response = self.accept_redirected_result(response: http.post(url, data: data, headers: headers, open_timeout: nil, timeout: nil), delay: delay, max_attempts: max_attempts)
15
15
 
16
16
  self.new(parse_json(response.body))
17
17
  end
@@ -24,12 +24,12 @@ module RestfulResource
24
24
  resource_location = response.headers[:location]
25
25
 
26
26
  RestfulResource::Redirections.wait(delay)
27
- new_response = http.get(resource_location, headers: {})
27
+ new_response = http.get(resource_location, headers: {}, open_timeout: nil, timeout: nil)
28
28
 
29
29
  while (new_response.status == 202) && (attempts < max_attempts)
30
30
  attempts += 1
31
31
  RestfulResource::Redirections.wait(delay)
32
- new_response = http.get(resource_location, headers: {})
32
+ new_response = http.get(resource_location, headers: {}, open_timeout: nil, timeout: nil)
33
33
  end
34
34
 
35
35
  if attempts == max_attempts
@@ -1,9 +1,14 @@
1
1
  module RestfulResource
2
2
  class Request
3
- attr_reader :body, :method, :url
3
+ attr_reader :body, :method, :url, :open_timeout, :timeout
4
4
 
5
- def initialize(method, url, headers: {}, body: nil)
6
- @method, @url, @headers, @body = method, url, headers, body
5
+ def initialize(method, url, headers: {}, body: nil, open_timeout: nil, timeout: nil)
6
+ @method = method
7
+ @url = url
8
+ @headers = headers
9
+ @body = body
10
+ @open_timeout = open_timeout
11
+ @timeout = timeout
7
12
  end
8
13
 
9
14
  def headers
@@ -14,9 +19,8 @@ module RestfulResource
14
19
 
15
20
  # Formats all keys in Word-Word format
16
21
  def format_headers
17
- @headers.stringify_keys.inject({}) do |h, key_with_value|
18
- h[format_key key_with_value.first] = key_with_value.last
19
- h
22
+ @headers.stringify_keys.each_with_object({}) do |key_with_value, headers|
23
+ headers[format_key(key_with_value.first)] = key_with_value.last
20
24
  end
21
25
  end
22
26
 
@@ -1,3 +1,3 @@
1
1
  module RestfulResource
2
- VERSION = '2.0.2'
2
+ VERSION = '2.2.0'
3
3
  end
@@ -32,4 +32,5 @@ Gem::Specification.new do |spec|
32
32
  spec.add_dependency "activesupport"
33
33
  spec.add_dependency "rack"
34
34
  spec.add_dependency "typhoeus"
35
+ spec.add_dependency "faraday-cdn-metrics"
35
36
  end
@@ -85,6 +85,7 @@ describe RestfulResource::HttpClient do
85
85
  api_name: 'api',
86
86
  request_instrument_name: 'http.api',
87
87
  cache_instrument_name: 'http_cache.api',
88
+ server_cache_instrument_name: 'cdn_metrics.api',
88
89
  metric_class: FakeMetrics)
89
90
  end
90
91
 
@@ -9,39 +9,47 @@ RSpec.configure do |config|
9
9
  end
10
10
 
11
11
 
12
- def expect_get(url, response, headers: {})
13
- expect(@mock_http).to receive(:get).with(url, headers: headers).and_return(response)
12
+ def expect_get(url, response, headers: {}, open_timeout: nil, timeout: nil)
13
+ expect(@mock_http).to receive(:get)
14
+ .with(url, headers: headers, open_timeout: open_timeout, timeout: timeout)
15
+ .and_return(response)
14
16
  end
15
17
 
16
- def expect_delete(url, response, headers: {})
17
- expect(@mock_http).to receive(:delete).with(url, headers: headers).and_return(response)
18
+ def expect_delete(url, response, headers: {}, open_timeout: nil, timeout: nil)
19
+ expect(@mock_http).to receive(:delete)
20
+ .with(url, headers: headers, open_timeout: open_timeout, timeout: timeout)
21
+ .and_return(response)
18
22
  end
19
23
 
20
- def expect_put(url, response, data: {}, headers: {})
21
- expect(@mock_http).to receive(:put).with(url, data: data, headers: headers).and_return(response)
24
+ def expect_put(url, response, data: {}, headers: {}, open_timeout: nil, timeout: nil)
25
+ expect(@mock_http).to receive(:put)
26
+ .with(url, data: data, headers: headers, open_timeout: open_timeout, timeout: timeout)
27
+ .and_return(response)
22
28
  end
23
29
 
24
- def expect_post(url, response, data: {}, headers: {})
25
- expect(@mock_http).to receive(:post).with(url, data: data, headers: headers).and_return(response)
30
+ def expect_post(url, response, data: {}, headers: {}, open_timeout: nil, timeout: nil)
31
+ expect(@mock_http).to receive(:post)
32
+ .with(url, data: data, headers: headers, open_timeout: open_timeout, timeout: timeout)
33
+ .and_return(response)
26
34
  end
27
35
 
28
36
  def expect_get_with_unprocessable_entity(url, response)
29
37
  request = RestfulResource::Request.new(:get, url)
30
38
  rest_client_response = OpenStruct.new({body: response.body, headers: response.headers, code: response.status})
31
39
  exception = RestfulResource::HttpClient::UnprocessableEntity.new(request, rest_client_response)
32
- expect(@mock_http).to receive(:get).with(url, headers: {}).and_raise(exception)
40
+ expect(@mock_http).to receive(:get).with(url, headers: {}, open_timeout: nil, timeout: nil).and_raise(exception)
33
41
  end
34
42
 
35
43
  def expect_put_with_unprocessable_entity(url, response, data: {})
36
44
  request = RestfulResource::Request.new(:put, url, body: data)
37
45
  rest_client_response = OpenStruct.new({body: response.body, headers: response.headers, code: response.status})
38
46
  exception = RestfulResource::HttpClient::UnprocessableEntity.new(request, rest_client_response)
39
- expect(@mock_http).to receive(:put).with(url, data: data, headers: {}).and_raise(exception)
47
+ expect(@mock_http).to receive(:put).with(url, data: data, headers: {}, open_timeout: nil, timeout: nil).and_raise(exception)
40
48
  end
41
49
 
42
50
  def expect_post_with_unprocessable_entity(url, response, data: {})
43
51
  request = RestfulResource::Request.new(:put, url, body: data)
44
52
  rest_client_response = OpenStruct.new({body: response.body, headers: response.headers, code: response.status})
45
53
  exception = RestfulResource::HttpClient::UnprocessableEntity.new(request, rest_client_response)
46
- expect(@mock_http).to receive(:post).with(url, data: data, headers: {}).and_raise(exception)
54
+ expect(@mock_http).to receive(:post).with(url, data: data, headers: {}, open_timeout: nil, timeout: nil).and_raise(exception)
47
55
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restful_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Santoro
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-10-13 00:00:00.000000000 Z
12
+ date: 2017-10-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -179,6 +179,20 @@ dependencies:
179
179
  - - ">="
180
180
  - !ruby/object:Gem::Version
181
181
  version: '0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: faraday-cdn-metrics
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ type: :runtime
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
182
196
  description: A simple activerecord inspired rest resource base class implemented using
183
197
  rest-client
184
198
  email: