shutl_resource 0.10.6 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28,19 +28,11 @@ module Shutl::Resource
28
28
 
29
29
  module Configuration
30
30
  class << self
31
- attr_accessor :base_uri
31
+ attr_accessor :base_uri, :logging_enabled
32
32
 
33
33
  def configure
34
34
  yield self
35
35
  end
36
-
37
- def logger
38
- @logger ||= Logger.new($stdout)
39
- end
40
-
41
- def logger=(logger)
42
- @logger = logger
43
- end
44
36
  end
45
37
  end
46
38
  end
@@ -14,14 +14,8 @@ module Shutl::Resource
14
14
  attr_reader :response
15
15
 
16
16
  def self.included(base)
17
- base.send :include, HTTParty
18
17
  base.send :extend, Shutl::Resource::RestClassMethods
19
18
 
20
- base.send :headers, {
21
- 'Accept' => 'application/json',
22
- 'Content-Type' => 'application/json'
23
- }
24
-
25
19
  base.send :resource_name, base.name.split('::').last.underscore
26
20
  base.send :resource_id, :id
27
21
  end
@@ -1,5 +1,29 @@
1
1
  module Shutl::Resource
2
2
  module RestClassMethods
3
+ def base_uri uri
4
+ @base_uri = uri
5
+ end
6
+
7
+ def connection
8
+ @connection ||= Faraday.new(:url => @base_uri || Shutl::Resource.base_uri) do |faraday|
9
+ faraday.request :url_encoded # form-encode POST params
10
+ faraday.response :logger if Shutl::Resource.logging_enabled
11
+ faraday.response :json
12
+
13
+ # faraday.ssl[:ca_file] = ENV["SSL_CERT_FILE"]
14
+
15
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
16
+ end
17
+ end
18
+
19
+ def headers
20
+ {
21
+ 'Accept' => 'application/json',
22
+ 'Content-Type' => 'application/json',
23
+ 'User-Agent' => "Shutl Resource Gem v#{Shutl::Resource::VERSION}"
24
+ }
25
+ end
26
+
3
27
  def find(args = {}, params = {})
4
28
  params = args if @singular_resource
5
29
  auth_options = { auth: params.delete(:auth), from: params.delete(:from) }
@@ -14,13 +38,13 @@ module Shutl::Resource
14
38
  url = member_url args.dup, params
15
39
  end
16
40
 
17
- response = get url, headers_with_auth(auth_options)
41
+ response = connection.get(url) do |req|
42
+ req.headers = headers_with_auth(auth_options)
43
+ end
18
44
 
19
45
  check_fail response, "Failed to find #{name}! args: #{args}, params: #{params}"
20
46
 
21
- parsed = response.parsed_response
22
-
23
- including_parent_attributes = parsed[@resource_name].merge args
47
+ including_parent_attributes = response.body[@resource_name].merge args
24
48
  new_object including_parent_attributes, response
25
49
  end
26
50
 
@@ -28,40 +52,41 @@ module Shutl::Resource
28
52
  url = generate_collection_url attributes
29
53
  attributes.delete "response"
30
54
 
31
- response = post(
32
- url,
33
- { body: { @resource_name => attributes }.to_json }.merge(headers_with_auth(options))
34
- )
55
+ response = connection.post(url) do |req|
56
+ req.headers = headers_with_auth(options)
57
+ req.body = { @resource_name => attributes }.to_json
58
+ end
35
59
 
36
60
  check_fail response, "Create failed"
37
61
 
38
- parsed = response.parsed_response || {}
62
+ parsed = response.body || {}
39
63
  attributes = parsed[@resource_name] || {}
40
64
 
41
65
  new_object attributes, response
42
66
  end
43
67
 
44
68
  def destroy instance, options = {}
45
- message = "Failed to destroy #{name.downcase.pluralize}"
69
+ failure_message = "Failed to destroy #{name.downcase.pluralize}"
46
70
 
47
71
  perform_action(
48
72
  instance,
49
73
  :delete,
74
+ {},
50
75
  headers_with_auth(options),
51
- message
76
+ failure_message
52
77
  ).success?
53
78
  end
54
79
 
55
80
  def save instance, options = {}
56
- #TODO: this is sometimes a hash and sometimes a Rest - need to rethink this
57
81
  attributes = instance.attributes rescue instance
58
82
 
59
- payload = {
60
- body: { @resource_name => convert_new_id(attributes) }.to_json
61
- }
83
+ body = { @resource_name => convert_new_id(attributes) }.to_json
62
84
 
63
- payload_with_headers = payload.merge(headers_with_auth options)
64
- response = perform_action(instance, :put, payload, "Save failed")
85
+ response = perform_action(instance,
86
+ :put,
87
+ body,
88
+ headers_with_auth(options),
89
+ "Save failed")
65
90
 
66
91
  response.success?
67
92
  end
@@ -79,11 +104,13 @@ module Shutl::Resource
79
104
  params = partition.last.inject({}) { |h, pair| h[pair.first] = pair.last; h }
80
105
 
81
106
  url = generate_collection_url url_args, params
82
- response = get url, headers_with_auth(auth_options)
107
+ response = connection.get(url) do |req|
108
+ req.headers = headers_with_auth(auth_options)
109
+ end
83
110
 
84
111
  check_fail response, "Failed to find all #{name.downcase.pluralize}"
85
112
 
86
- response_object = response.parsed_response[@resource_name.pluralize].map do |h|
113
+ response_object = response.body[@resource_name.pluralize].map do |h|
87
114
  new_object(args.merge(h), response)
88
115
  end
89
116
  if order_collection?
@@ -94,7 +121,7 @@ module Shutl::Resource
94
121
  end
95
122
  end
96
123
 
97
- RestCollection.new(response_object, response.parsed_response['pagination'])
124
+ RestCollection.new(response_object, response.body['pagination'])
98
125
  end
99
126
 
100
127
  class RestCollection
@@ -204,15 +231,17 @@ module Shutl::Resource
204
231
  h['Authorization'] = "Bearer #{options[:auth]}" if options[:auth]
205
232
  h['From'] = "#{options[:from]}" if options[:from]
206
233
  end
207
- { headers: headers }
208
234
  end
209
235
 
210
- def perform_action instance, verb, args, failure_message
236
+ def perform_action instance, verb, body, headers, failure_message
211
237
  attributes = instance.is_a?(Hash) ? instance : instance.attributes
212
238
  attributes.delete "response" #used in debugging requests/responses
213
239
 
214
240
  url = member_url attributes
215
- response = send verb, url, args
241
+ response = connection.send(verb, url) do |req|
242
+ req.headers = headers
243
+ req.body = body
244
+ end
216
245
 
217
246
  check_fail response, failure_message
218
247
 
@@ -223,7 +252,7 @@ module Shutl::Resource
223
252
  instance = new add_resource_id_to(args), response
224
253
 
225
254
  instance.tap do |i|
226
- parsed_response = response.parsed_response
255
+ parsed_response = response.body
227
256
 
228
257
  if errors = (parsed_response and parsed_response["errors"])
229
258
  i.errors = errors
@@ -232,8 +261,7 @@ module Shutl::Resource
232
261
  end
233
262
 
234
263
  def check_fail response, message
235
- c = response.code
236
- failure_klass = case c
264
+ failure_klass = case response.status
237
265
  when 299
238
266
  if Shutl::Resource.raise_exceptions_on_no_quotes_generated
239
267
  Shutl::NoQuotesGenerated
@@ -264,7 +292,7 @@ module Shutl::Resource
264
292
 
265
293
 
266
294
  output = begin
267
- response.parsed_response["errors"]["base"]
295
+ response.body["errors"]["base"]
268
296
  rescue
269
297
  message
270
298
  end
@@ -277,8 +305,6 @@ module Shutl::Resource
277
305
  def generate_url!(url_pattern, args, params = {})
278
306
  url = url_pattern.dup
279
307
 
280
- url = "#{Shutl::Resource.base_uri}#{url}" unless self.base_uri
281
-
282
308
  args, url = replace_args_from_pattern! args, url
283
309
 
284
310
  url = URI.escape url
@@ -1,5 +1,5 @@
1
1
  module Shutl
2
2
  module Resource
3
- VERSION = '0.10.6'
3
+ VERSION = '0.11.0'
4
4
  end
5
5
  end
@@ -1,6 +1,9 @@
1
1
  module Shutl
2
2
  end
3
3
 
4
+ require 'faraday'
5
+ require 'faraday_middleware'
6
+
4
7
  require 'shutl_auth'
5
8
  require 'shutl/resource/configuration'
6
9
  require 'shutl/resource/rest'
@@ -10,7 +13,7 @@ require 'shutl/resource/errors'
10
13
  module Shutl::Resource
11
14
  extend self
12
15
 
13
- delegate :logger, :logger=, :base_uri, :base_uri=, to: Configuration
16
+ delegate :logging_enabled, :logging_enabled=, :base_uri, :base_uri=, to: Configuration
14
17
 
15
18
  def configure(*args, &block)
16
19
  Configuration.configure(*args, &block)
@@ -21,6 +21,8 @@ Gem::Specification.new do |gem|
21
21
  gem.add_dependency 'httparty', '~> 0.10.0'
22
22
  gem.add_dependency 'shutl_auth', '0.8.0'
23
23
  gem.add_dependency 'activemodel'
24
+ gem.add_dependency 'faraday'
25
+ gem.add_dependency 'faraday_middleware'
24
26
 
25
27
  gem.add_development_dependency 'rake'
26
28
  gem.add_development_dependency 'rspec', '~> 2.11.0'
@@ -2,18 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe Shutl::Resource do
4
4
  describe '#configure' do
5
- let(:logger) { Shutl::Resource.logger }
6
-
7
- it 'should configure the logger' do
8
- logger = stub('logger')
9
-
10
- Shutl::Resource.configure do |config|
11
- config.logger = logger
12
- end
13
-
14
- Shutl::Resource.logger.should == logger
15
- end
16
-
17
5
  it "allows for configuration of the base uri" do
18
6
  Shutl::Resource.configure do |config|
19
7
  config.base_uri = 'base uri'
@@ -2,14 +2,9 @@ require 'spec_helper'
2
2
 
3
3
  describe Shutl::Resource::Rest do
4
4
  let(:headers) do
5
- { 'Accept' => 'application/json', 'Content-Type' => 'application/json' }
6
- end
7
-
8
- it 'should include the REST verb' do
9
- TestRest.should respond_to :get
10
- TestRest.should respond_to :post
11
- TestRest.should respond_to :post
12
- TestRest.should respond_to :delete
5
+ { 'Accept' => 'application/json',
6
+ 'Content-Type' => 'application/json',
7
+ 'User-Agent' => "Shutl Resource Gem v#{Shutl::Resource::VERSION}" }
13
8
  end
14
9
 
15
10
  let(:resource) { TestRest.new(a: 'a', b: 2) }
data/spec/spec_helper.rb CHANGED
@@ -5,4 +5,7 @@ require 'support/test_resource'
5
5
  require 'support/test_resource'
6
6
  require 'support/configured_base_uri_resource'
7
7
  require 'support/test_singular_resource'
8
- require 'support/double_logger'
8
+
9
+ Shutl::Resource.configure do |config|
10
+ config.logging_enabled = false
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shutl_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.6
4
+ version: 0.11.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -15,7 +15,7 @@ date: 2013-07-19 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: httparty
18
- requirement: &70172591200440 !ruby/object:Gem::Requirement
18
+ requirement: &70223946241460 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ~>
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: 0.10.0
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *70172591200440
26
+ version_requirements: *70223946241460
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: shutl_auth
29
- requirement: &70172591199320 !ruby/object:Gem::Requirement
29
+ requirement: &70223946238100 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - =
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: 0.8.0
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *70172591199320
37
+ version_requirements: *70223946238100
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: activemodel
40
- requirement: &70172591198300 !ruby/object:Gem::Requirement
40
+ requirement: &70223946237240 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,10 +45,32 @@ dependencies:
45
45
  version: '0'
46
46
  type: :runtime
47
47
  prerelease: false
48
- version_requirements: *70172591198300
48
+ version_requirements: *70223946237240
49
+ - !ruby/object:Gem::Dependency
50
+ name: faraday
51
+ requirement: &70223946267260 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: *70223946267260
60
+ - !ruby/object:Gem::Dependency
61
+ name: faraday_middleware
62
+ requirement: &70223946264740 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: *70223946264740
49
71
  - !ruby/object:Gem::Dependency
50
72
  name: rake
51
- requirement: &70172591220740 !ruby/object:Gem::Requirement
73
+ requirement: &70223946262780 !ruby/object:Gem::Requirement
52
74
  none: false
53
75
  requirements:
54
76
  - - ! '>='
@@ -56,10 +78,10 @@ dependencies:
56
78
  version: '0'
57
79
  type: :development
58
80
  prerelease: false
59
- version_requirements: *70172591220740
81
+ version_requirements: *70223946262780
60
82
  - !ruby/object:Gem::Dependency
61
83
  name: rspec
62
- requirement: &70172591214620 !ruby/object:Gem::Requirement
84
+ requirement: &70223946289820 !ruby/object:Gem::Requirement
63
85
  none: false
64
86
  requirements:
65
87
  - - ~>
@@ -67,10 +89,10 @@ dependencies:
67
89
  version: 2.11.0
68
90
  type: :development
69
91
  prerelease: false
70
- version_requirements: *70172591214620
92
+ version_requirements: *70223946289820
71
93
  - !ruby/object:Gem::Dependency
72
94
  name: debugger
73
- requirement: &70172591232420 !ruby/object:Gem::Requirement
95
+ requirement: &70223946284400 !ruby/object:Gem::Requirement
74
96
  none: false
75
97
  requirements:
76
98
  - - ! '>='
@@ -78,10 +100,10 @@ dependencies:
78
100
  version: '0'
79
101
  type: :development
80
102
  prerelease: false
81
- version_requirements: *70172591232420
103
+ version_requirements: *70223946284400
82
104
  - !ruby/object:Gem::Dependency
83
105
  name: webmock
84
- requirement: &70172591231420 !ruby/object:Gem::Requirement
106
+ requirement: &70223946301380 !ruby/object:Gem::Requirement
85
107
  none: false
86
108
  requirements:
87
109
  - - ~>
@@ -89,7 +111,7 @@ dependencies:
89
111
  version: 1.8.7
90
112
  type: :development
91
113
  prerelease: false
92
- version_requirements: *70172591231420
114
+ version_requirements: *70223946301380
93
115
  description: Shutl Rest resource
94
116
  email:
95
117
  - davidr@shutl.co.uk
@@ -123,7 +145,6 @@ files:
123
145
  - spec/rest_resource_spec.rb
124
146
  - spec/spec_helper.rb
125
147
  - spec/support/configured_base_uri_resource.rb
126
- - spec/support/double_logger.rb
127
148
  - spec/support/test_resource.rb
128
149
  - spec/support/test_singular_resource.rb
129
150
  homepage: ''
@@ -140,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
140
161
  version: '0'
141
162
  segments:
142
163
  - 0
143
- hash: -655986128022496311
164
+ hash: -4070568380889602956
144
165
  required_rubygems_version: !ruby/object:Gem::Requirement
145
166
  none: false
146
167
  requirements:
@@ -149,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
170
  version: '0'
150
171
  segments:
151
172
  - 0
152
- hash: -655986128022496311
173
+ hash: -4070568380889602956
153
174
  requirements: []
154
175
  rubyforge_project:
155
176
  rubygems_version: 1.8.11
@@ -164,6 +185,5 @@ test_files:
164
185
  - spec/rest_resource_spec.rb
165
186
  - spec/spec_helper.rb
166
187
  - spec/support/configured_base_uri_resource.rb
167
- - spec/support/double_logger.rb
168
188
  - spec/support/test_resource.rb
169
189
  - spec/support/test_singular_resource.rb
@@ -1,14 +0,0 @@
1
-
2
- module Shutl::Resource
3
- class NoLogger
4
- def debug(message) ; end
5
- def info(message) ; end
6
- def warn(message) ; end
7
- def error(message) ; end
8
- def fatal(message) ; end
9
- end
10
- end
11
-
12
- Shutl::Resource.configure do |config|
13
- config.logger = Shutl::Resource::NoLogger.new
14
- end