shutl_resource 0.11.4 → 1.0.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.
- 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
|