shutl_resource 0.11.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/shutl/resource/configuration.rb +9 -1
- data/lib/shutl/resource/rest.rb +6 -0
- data/lib/shutl/resource/rest_class_methods.rb +29 -58
- data/lib/shutl/resource/version.rb +1 -1
- data/lib/shutl_resource.rb +0 -4
- data/shutl_resource.gemspec +0 -3
- data/spec/configuration_spec.rb +12 -0
- data/spec/remote_url_spec.rb +1 -1
- data/spec/rest_resource_spec.rb +8 -3
- data/spec/spec_helper.rb +1 -0
- data/spec/support/double_logger.rb +14 -0
- metadata +6 -52
@@ -28,11 +28,19 @@ module Shutl::Resource
|
|
28
28
|
|
29
29
|
module Configuration
|
30
30
|
class << self
|
31
|
-
attr_accessor :base_uri
|
31
|
+
attr_accessor :base_uri
|
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
|
36
44
|
end
|
37
45
|
end
|
38
46
|
end
|
data/lib/shutl/resource/rest.rb
CHANGED
@@ -14,8 +14,14 @@ module Shutl::Resource
|
|
14
14
|
attr_reader :response
|
15
15
|
|
16
16
|
def self.included(base)
|
17
|
+
base.send :include, HTTParty
|
17
18
|
base.send :extend, Shutl::Resource::RestClassMethods
|
18
19
|
|
20
|
+
base.send :headers, {
|
21
|
+
'Accept' => 'application/json',
|
22
|
+
'Content-Type' => 'application/json'
|
23
|
+
}
|
24
|
+
|
19
25
|
base.send :resource_name, base.name.split('::').last.underscore
|
20
26
|
base.send :resource_id, :id
|
21
27
|
end
|
@@ -1,33 +1,6 @@
|
|
1
1
|
require 'open-uri'
|
2
2
|
module Shutl::Resource
|
3
3
|
module RestClassMethods
|
4
|
-
def base_uri uri
|
5
|
-
@base_uri = uri
|
6
|
-
end
|
7
|
-
|
8
|
-
def connection
|
9
|
-
@connection ||= Faraday.new(:url => @base_uri || Shutl::Resource.base_uri) do |faraday|
|
10
|
-
faraday.request :url_encoded # form-encode POST params
|
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
|
-
|
17
|
-
if Shutl::Resource.logger
|
18
|
-
faraday.use :extended_logging, logger: Shutl::Resource.logger
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def headers
|
24
|
-
{
|
25
|
-
'Accept' => 'application/json',
|
26
|
-
'Content-Type' => 'application/json',
|
27
|
-
'User-Agent' => "Shutl Resource Gem v#{Shutl::Resource::VERSION}"
|
28
|
-
}
|
29
|
-
end
|
30
|
-
|
31
4
|
def find(args = {}, params = {})
|
32
5
|
params = args if @singular_resource
|
33
6
|
auth_options = { auth: params.delete(:auth), from: params.delete(:from) }
|
@@ -42,13 +15,13 @@ module Shutl::Resource
|
|
42
15
|
url = member_url args.dup, params
|
43
16
|
end
|
44
17
|
|
45
|
-
response =
|
46
|
-
req.headers = headers_with_auth(auth_options)
|
47
|
-
end
|
18
|
+
response = get url, headers_with_auth(auth_options)
|
48
19
|
|
49
20
|
check_fail response, "Failed to find #{name}! args: #{args}, params: #{params}"
|
50
21
|
|
51
|
-
|
22
|
+
parsed = response.parsed_response
|
23
|
+
|
24
|
+
including_parent_attributes = parsed[@resource_name].merge args
|
52
25
|
new_object including_parent_attributes, response
|
53
26
|
end
|
54
27
|
|
@@ -56,41 +29,40 @@ module Shutl::Resource
|
|
56
29
|
url = generate_collection_url attributes
|
57
30
|
attributes.delete "response"
|
58
31
|
|
59
|
-
response =
|
60
|
-
|
61
|
-
|
62
|
-
|
32
|
+
response = post(
|
33
|
+
url,
|
34
|
+
{ body: { @resource_name => attributes }.to_json }.merge(headers_with_auth(options))
|
35
|
+
)
|
63
36
|
|
64
37
|
check_fail response, "Create failed"
|
65
38
|
|
66
|
-
parsed = response.
|
39
|
+
parsed = response.parsed_response || {}
|
67
40
|
attributes = parsed[@resource_name] || {}
|
68
41
|
|
69
42
|
new_object attributes, response
|
70
43
|
end
|
71
44
|
|
72
45
|
def destroy instance, options = {}
|
73
|
-
|
46
|
+
message = "Failed to destroy #{name.downcase.pluralize}"
|
74
47
|
|
75
48
|
perform_action(
|
76
49
|
instance,
|
77
50
|
:delete,
|
78
|
-
{},
|
79
51
|
headers_with_auth(options),
|
80
|
-
|
52
|
+
message
|
81
53
|
).success?
|
82
54
|
end
|
83
55
|
|
84
56
|
def save instance, options = {}
|
57
|
+
#TODO: this is sometimes a hash and sometimes a Rest - need to rethink this
|
85
58
|
attributes = instance.attributes rescue instance
|
86
59
|
|
87
|
-
|
60
|
+
payload = {
|
61
|
+
body: { @resource_name => convert_new_id(attributes) }.to_json
|
62
|
+
}
|
88
63
|
|
89
|
-
|
90
|
-
|
91
|
-
body,
|
92
|
-
headers_with_auth(options),
|
93
|
-
"Save failed")
|
64
|
+
payload_with_headers = payload.merge(headers_with_auth options)
|
65
|
+
response = perform_action(instance, :put, payload, "Save failed")
|
94
66
|
|
95
67
|
response.success?
|
96
68
|
end
|
@@ -108,13 +80,11 @@ module Shutl::Resource
|
|
108
80
|
params = partition.last.inject({}) { |h, pair| h[pair.first] = pair.last; h }
|
109
81
|
|
110
82
|
url = generate_collection_url url_args, params
|
111
|
-
response =
|
112
|
-
req.headers = headers_with_auth(auth_options)
|
113
|
-
end
|
83
|
+
response = get url, headers_with_auth(auth_options)
|
114
84
|
|
115
85
|
check_fail response, "Failed to find all #{name.downcase.pluralize}"
|
116
86
|
|
117
|
-
response_object = response.
|
87
|
+
response_object = response.parsed_response[@resource_name.pluralize].map do |h|
|
118
88
|
new_object(args.merge(h), response)
|
119
89
|
end
|
120
90
|
if order_collection?
|
@@ -125,7 +95,7 @@ module Shutl::Resource
|
|
125
95
|
end
|
126
96
|
end
|
127
97
|
|
128
|
-
RestCollection.new(response_object, response.
|
98
|
+
RestCollection.new(response_object, response.parsed_response['pagination'])
|
129
99
|
end
|
130
100
|
|
131
101
|
class RestCollection
|
@@ -235,17 +205,15 @@ module Shutl::Resource
|
|
235
205
|
h['Authorization'] = "Bearer #{options[:auth]}" if options[:auth]
|
236
206
|
h['From'] = "#{options[:from]}" if options[:from]
|
237
207
|
end
|
208
|
+
{ headers: headers }
|
238
209
|
end
|
239
210
|
|
240
|
-
def perform_action instance, verb,
|
211
|
+
def perform_action instance, verb, args, failure_message
|
241
212
|
attributes = instance.is_a?(Hash) ? instance : instance.attributes
|
242
213
|
attributes.delete "response" #used in debugging requests/responses
|
243
214
|
|
244
215
|
url = member_url attributes
|
245
|
-
response =
|
246
|
-
req.headers = headers
|
247
|
-
req.body = body
|
248
|
-
end
|
216
|
+
response = send verb, url, args
|
249
217
|
|
250
218
|
check_fail response, failure_message
|
251
219
|
|
@@ -256,7 +224,7 @@ module Shutl::Resource
|
|
256
224
|
instance = new add_resource_id_to(args), response
|
257
225
|
|
258
226
|
instance.tap do |i|
|
259
|
-
parsed_response = response.
|
227
|
+
parsed_response = response.parsed_response
|
260
228
|
|
261
229
|
if errors = (parsed_response and parsed_response["errors"])
|
262
230
|
i.errors = errors
|
@@ -265,7 +233,8 @@ module Shutl::Resource
|
|
265
233
|
end
|
266
234
|
|
267
235
|
def check_fail response, message
|
268
|
-
|
236
|
+
c = response.code
|
237
|
+
failure_klass = case c
|
269
238
|
when 299
|
270
239
|
if Shutl::Resource.raise_exceptions_on_no_quotes_generated
|
271
240
|
Shutl::NoQuotesGenerated
|
@@ -296,7 +265,7 @@ module Shutl::Resource
|
|
296
265
|
|
297
266
|
|
298
267
|
output = begin
|
299
|
-
response.
|
268
|
+
response.parsed_response["errors"]["base"]
|
300
269
|
rescue
|
301
270
|
message
|
302
271
|
end
|
@@ -309,6 +278,8 @@ module Shutl::Resource
|
|
309
278
|
def generate_url!(url_pattern, args, params = {})
|
310
279
|
url = url_pattern.dup
|
311
280
|
|
281
|
+
url = "#{Shutl::Resource.base_uri}#{url}" unless self.base_uri
|
282
|
+
|
312
283
|
args, url = replace_args_from_pattern! args, url
|
313
284
|
|
314
285
|
url = URI.escape url
|
data/lib/shutl_resource.rb
CHANGED
data/shutl_resource.gemspec
CHANGED
@@ -21,9 +21,6 @@ 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'
|
26
|
-
gem.add_dependency 'faraday-conductivity'
|
27
24
|
|
28
25
|
gem.add_development_dependency 'rake'
|
29
26
|
gem.add_development_dependency 'rspec', '~> 2.11.0'
|
data/spec/configuration_spec.rb
CHANGED
@@ -2,6 +2,18 @@ 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
|
+
|
5
17
|
it "allows for configuration of the base uri" do
|
6
18
|
Shutl::Resource.configure do |config|
|
7
19
|
config.base_uri = 'base uri'
|
data/spec/remote_url_spec.rb
CHANGED
@@ -81,7 +81,7 @@ describe Shutl::Resource::Rest do
|
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'should support the params with invalid uri name' do
|
84
|
-
request = stub_request(:get, 'http://host/nested/10/resources?arg1=val1&arg%
|
84
|
+
request = stub_request(:get, 'http://host/nested/10/resources?arg1=val1&arg%202=val2').
|
85
85
|
to_return(body: '{"nested_resources": []}', headers: headers)
|
86
86
|
|
87
87
|
NestedResource.all(parent_id: 10, arg1: 'val1', :'arg 2' => 'val2')
|
data/spec/rest_resource_spec.rb
CHANGED
@@ -2,9 +2,14 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Shutl::Resource::Rest do
|
4
4
|
let(:headers) do
|
5
|
-
{ 'Accept' => 'application/json',
|
6
|
-
|
7
|
-
|
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
|
8
13
|
end
|
9
14
|
|
10
15
|
let(:resource) { TestRest.new(a: 'a', b: 2) }
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
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
|
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.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-08-
|
14
|
+
date: 2013-08-02 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: httparty
|
@@ -61,54 +61,6 @@ dependencies:
|
|
61
61
|
- - ! '>='
|
62
62
|
- !ruby/object:Gem::Version
|
63
63
|
version: '0'
|
64
|
-
- !ruby/object:Gem::Dependency
|
65
|
-
name: faraday
|
66
|
-
requirement: !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
|
-
requirements:
|
69
|
-
- - ! '>='
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
version: '0'
|
72
|
-
type: :runtime
|
73
|
-
prerelease: false
|
74
|
-
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
|
-
requirements:
|
77
|
-
- - ! '>='
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version: '0'
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
name: faraday_middleware
|
82
|
-
requirement: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
|
-
requirements:
|
85
|
-
- - ! '>='
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: '0'
|
88
|
-
type: :runtime
|
89
|
-
prerelease: false
|
90
|
-
version_requirements: !ruby/object:Gem::Requirement
|
91
|
-
none: false
|
92
|
-
requirements:
|
93
|
-
- - ! '>='
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '0'
|
96
|
-
- !ruby/object:Gem::Dependency
|
97
|
-
name: faraday-conductivity
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
99
|
-
none: false
|
100
|
-
requirements:
|
101
|
-
- - ! '>='
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :runtime
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
none: false
|
108
|
-
requirements:
|
109
|
-
- - ! '>='
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
version: '0'
|
112
64
|
- !ruby/object:Gem::Dependency
|
113
65
|
name: rake
|
114
66
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,6 +158,7 @@ files:
|
|
206
158
|
- spec/rest_resource_spec.rb
|
207
159
|
- spec/spec_helper.rb
|
208
160
|
- spec/support/configured_base_uri_resource.rb
|
161
|
+
- spec/support/double_logger.rb
|
209
162
|
- spec/support/test_resource.rb
|
210
163
|
- spec/support/test_singular_resource.rb
|
211
164
|
homepage: ''
|
@@ -222,7 +175,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
222
175
|
version: '0'
|
223
176
|
segments:
|
224
177
|
- 0
|
225
|
-
hash:
|
178
|
+
hash: 2862234294544768530
|
226
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
227
180
|
none: false
|
228
181
|
requirements:
|
@@ -231,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
184
|
version: '0'
|
232
185
|
segments:
|
233
186
|
- 0
|
234
|
-
hash:
|
187
|
+
hash: 2862234294544768530
|
235
188
|
requirements: []
|
236
189
|
rubyforge_project:
|
237
190
|
rubygems_version: 1.8.25
|
@@ -246,5 +199,6 @@ test_files:
|
|
246
199
|
- spec/rest_resource_spec.rb
|
247
200
|
- spec/spec_helper.rb
|
248
201
|
- spec/support/configured_base_uri_resource.rb
|
202
|
+
- spec/support/double_logger.rb
|
249
203
|
- spec/support/test_resource.rb
|
250
204
|
- spec/support/test_singular_resource.rb
|