restful_resource 2.0.2 → 2.2.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 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: