resource_kit 0.0.3 → 0.0.5
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 +4 -4
- data/README.md +1 -2
- data/lib/resource_kit.rb +1 -0
- data/lib/resource_kit/action.rb +6 -0
- data/lib/resource_kit/action_invoker.rb +30 -15
- data/lib/resource_kit/endpoint_resolver.rb +1 -1
- data/lib/resource_kit/resource.rb +13 -5
- data/lib/resource_kit/version.rb +1 -1
- data/spec/lib/resource_kit/action_invoker_spec.rb +13 -0
- data/spec/lib/resource_kit/action_spec.rb +7 -0
- data/spec/lib/resource_kit/resource_spec.rb +16 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee001caaa4f22885773d1f6e6ae076ec900762e2
|
4
|
+
data.tar.gz: b373c40127c0a4d7312ecea86ae634acd1ccbe85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfcc677710aef8a376ac1d47e795b1267f2131ddd969f70352421b5b80788e7099a73dc04cba6282f5fe828ddc2f52ccc19e7856f0fbe591c8463381f4f89eb4
|
7
|
+
data.tar.gz: 987624fc56bb90b02ae917c91b8802fcc54697497b1776695fecd915d8b4e3f38dc73a98318bed5cebcc73b08c5c824c8a24f21e993324c8a2757277e0e17534
|
data/README.md
CHANGED
@@ -90,13 +90,12 @@ create = resource.create(Droplet.new)
|
|
90
90
|
|
91
91
|
Things we've thought about but just haven't implemented are:
|
92
92
|
|
93
|
-
* `action :find, 'PUT droplets/:id/restart'`
|
94
93
|
* Pagination capabilities
|
95
94
|
|
96
95
|
|
97
96
|
## Contributing
|
98
97
|
|
99
|
-
1. Fork it ( https://github.com/
|
98
|
+
1. Fork it ( https://github.com/digitaloceancloud/resource_kit/fork )
|
100
99
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
101
100
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
102
101
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/lib/resource_kit.rb
CHANGED
@@ -4,6 +4,7 @@ require 'faraday'
|
|
4
4
|
|
5
5
|
module ResourceKit
|
6
6
|
ALLOWED_VERBS = [:get, :post, :put, :delete, :head, :patch, :options]
|
7
|
+
ActionConnection = Struct.new(:action, :connection)
|
7
8
|
|
8
9
|
autoload :Resource, 'resource_kit/resource'
|
9
10
|
autoload :ResourceCollection, 'resource_kit/resource_collection'
|
data/lib/resource_kit/action.rb
CHANGED
@@ -6,6 +6,7 @@ module ResourceKit
|
|
6
6
|
@name = name
|
7
7
|
@verb = (verb && verb.downcase.to_sym) || :get
|
8
8
|
@path = path
|
9
|
+
@query_keys = []
|
9
10
|
end
|
10
11
|
|
11
12
|
def verb(v = nil)
|
@@ -18,6 +19,11 @@ module ResourceKit
|
|
18
19
|
@path
|
19
20
|
end
|
20
21
|
|
22
|
+
def query_keys(*keys)
|
23
|
+
return @query_keys if keys.empty?
|
24
|
+
@query_keys += keys
|
25
|
+
end
|
26
|
+
|
21
27
|
def handlers
|
22
28
|
@handlers ||= {}
|
23
29
|
end
|
@@ -1,23 +1,19 @@
|
|
1
1
|
module ResourceKit
|
2
2
|
class ActionInvoker
|
3
|
-
|
4
|
-
raise ArgumentError, "Verb '#{action.verb}' is not allowed" unless action.verb.in?(ALLOWED_VERBS)
|
5
|
-
options = args.last.kind_of?(Hash) ? args.last : {}
|
6
|
-
resolver = EndpointResolver.new(path: action.path)
|
3
|
+
attr_reader :action, :connection, :args, :options
|
7
4
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
response = connection.send(action.verb, resolver.resolve(options))
|
15
|
-
end
|
5
|
+
def initialize(action, connection, *args)
|
6
|
+
@action = action
|
7
|
+
@connection = connection
|
8
|
+
@args = args
|
9
|
+
@options = args.last.kind_of?(Hash) ? args.last : {}
|
10
|
+
end
|
16
11
|
|
17
|
-
|
12
|
+
def self.call(action, connection, *args)
|
13
|
+
new(action, connection, *args).handle_response
|
18
14
|
end
|
19
15
|
|
20
|
-
def
|
16
|
+
def handle_response
|
21
17
|
if handler = action.handlers[response.status]
|
22
18
|
handler.call(response)
|
23
19
|
else
|
@@ -25,8 +21,27 @@ module ResourceKit
|
|
25
21
|
end
|
26
22
|
end
|
27
23
|
|
28
|
-
def
|
24
|
+
def construct_body
|
29
25
|
action.body.call(*args[0..(action.body.arity - 1)])
|
30
26
|
end
|
27
|
+
|
28
|
+
def response
|
29
|
+
return @response if @response
|
30
|
+
|
31
|
+
raise ArgumentError, "Verb '#{action.verb}' is not allowed" unless action.verb.in?(ALLOWED_VERBS)
|
32
|
+
|
33
|
+
if action.body and action.verb.in?([:post, :put, :patch])
|
34
|
+
# This request is going to have a response body. Handle it.
|
35
|
+
@response = connection.send(action.verb, resolver.resolve(options)) do |request|
|
36
|
+
request.body = construct_body
|
37
|
+
end
|
38
|
+
else
|
39
|
+
@response = connection.send(action.verb, resolver.resolve(options))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def resolver
|
44
|
+
EndpointResolver.new(path: action.path, query_param_keys: action.query_keys)
|
45
|
+
end
|
31
46
|
end
|
32
47
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module ResourceKit
|
2
2
|
class Resource
|
3
|
-
class_attribute :
|
3
|
+
class_attribute :_resources
|
4
4
|
|
5
5
|
attr_reader :connection
|
6
6
|
|
@@ -9,11 +9,19 @@ module ResourceKit
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.resources(&block)
|
12
|
-
|
13
|
-
|
12
|
+
self._resources ||= ResourceCollection.new
|
13
|
+
self._resources.instance_eval(&block) if block_given?
|
14
14
|
|
15
|
-
MethodFactory.construct(self,
|
16
|
-
|
15
|
+
MethodFactory.construct(self, self._resources)
|
16
|
+
self._resources
|
17
|
+
end
|
18
|
+
|
19
|
+
def action(name)
|
20
|
+
_resources.find_action(name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def action_and_connection(action_name)
|
24
|
+
ActionConnection.new(action(action_name), connection)
|
17
25
|
end
|
18
26
|
end
|
19
27
|
end
|
data/lib/resource_kit/version.rb
CHANGED
@@ -8,6 +8,7 @@ RSpec.describe ResourceKit::ActionInvoker do
|
|
8
8
|
stub.get('/users/bad_page') { |env| [404, {}, 'not found'] }
|
9
9
|
stub.get('/users/12') { |env| [200, {}, 'user 12'] }
|
10
10
|
stub.post('/users') { |env| [200, {}, env[:body]] }
|
11
|
+
stub.get('/paged') { |env| [200, {}, env[:url].to_s] }
|
11
12
|
end
|
12
13
|
end
|
13
14
|
let(:action) { ResourceKit::Action.new(:find) }
|
@@ -70,5 +71,17 @@ RSpec.describe ResourceKit::ActionInvoker do
|
|
70
71
|
expect(result).to eq('echo me another')
|
71
72
|
end
|
72
73
|
end
|
74
|
+
|
75
|
+
context 'for requests with query params' do
|
76
|
+
it 'appends the query parameters to the endpoint' do
|
77
|
+
action.query_keys :per_page, :page
|
78
|
+
action.path '/paged'
|
79
|
+
|
80
|
+
result = ResourceKit::ActionInvoker.call(action, connection, page: 3, per_page: 300)
|
81
|
+
addressed = Addressable::URI.parse(result)
|
82
|
+
|
83
|
+
expect(addressed.query_values).to include('per_page' => '300', 'page' => '3')
|
84
|
+
end
|
85
|
+
end
|
73
86
|
end
|
74
87
|
end
|
@@ -52,4 +52,11 @@ RSpec.describe ResourceKit::Action do
|
|
52
52
|
expect(action.body).to be(handler)
|
53
53
|
end
|
54
54
|
end
|
55
|
+
|
56
|
+
describe '#query_keys' do
|
57
|
+
it 'allows setting known query parameters that we should append to the URL' do
|
58
|
+
action.query_keys :per_page, :page
|
59
|
+
expect(action.query_keys).to include(:per_page, :page)
|
60
|
+
end
|
61
|
+
end
|
55
62
|
end
|
@@ -36,4 +36,20 @@ RSpec.describe ResourceKit::Resource do
|
|
36
36
|
expect(instance.connection).to be(faraday)
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
40
|
+
describe '#action' do
|
41
|
+
it 'returns the action for the name passed' do
|
42
|
+
faraday = Faraday.new(url: 'http://lol.com')
|
43
|
+
|
44
|
+
class DummyResource < described_class
|
45
|
+
resources do
|
46
|
+
action :find, 'GET /hello'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
instance = DummyResource.new(faraday)
|
51
|
+
|
52
|
+
expect(instance.action(:find)).to be_kind_of(ResourceKit::Action)
|
53
|
+
end
|
54
|
+
end
|
39
55
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resource_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Ross
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-08-
|
12
|
+
date: 2014-08-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|