resource_kit 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +56 -6
- data/examples/digitalocean_droplets.rb +1 -1
- data/lib/resource_kit/action.rb +20 -1
- data/lib/resource_kit/action_invoker.rb +25 -14
- data/lib/resource_kit/method_factory.rb +1 -1
- data/lib/resource_kit/resource.rb +8 -4
- data/lib/resource_kit/resource_collection.rb +1 -1
- data/lib/resource_kit/status_code_mapper.rb +1 -1
- data/lib/resource_kit/testing/action_handler_matchers.rb +34 -0
- data/lib/resource_kit/testing/have_action_matchers.rb +68 -0
- data/lib/resource_kit/testing.rb +20 -0
- data/lib/resource_kit/version.rb +1 -1
- data/resource_kit.gemspec +3 -1
- data/spec/integration/resource_actions_spec.rb +41 -0
- data/spec/lib/resource_kit/action_invoker_spec.rb +72 -12
- data/spec/lib/resource_kit/action_spec.rb +26 -1
- data/spec/lib/resource_kit/method_factory_spec.rb +1 -1
- data/spec/lib/resource_kit/resource_collection_spec.rb +3 -3
- data/spec/lib/resource_kit/resource_spec.rb +13 -3
- data/spec/lib/resource_kit/testing/action_handler_matchers_spec.rb +40 -0
- data/spec/lib/resource_kit/testing/have_action_matchers_spec.rb +108 -0
- data/spec/spec_helper.rb +2 -0
- metadata +48 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4dba252d8a80b4ce9ecf96972dada6a221824b05
|
4
|
+
data.tar.gz: bb36d233fe0ae8e623b5f3c4c26a8a5dc74d2c81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63d61a484700d8bacf02569c3fe4c9cb5942f8cfc37e3fa3689b29a980e2726d0f2b190a2ea24cc9907e1b03a70be95f825ebf47c83cbdc40863b8656f435fcb
|
7
|
+
data.tar.gz: 6f6b4d111147cf08a39c5a10a8114838cdffef0b45667e645690c5419f6b15ed2c5f96b353d35deda2fa386828f179514e530456ff08a4b7c06886af105fe957
|
data/README.md
CHANGED
@@ -31,26 +31,26 @@ When you're able to answer these questions, you can describe them in your resour
|
|
31
31
|
```ruby
|
32
32
|
class DropletResource < ResourceKit::Resource
|
33
33
|
resources do
|
34
|
-
default_handler(422) {|response| ErrorMapping.extract_single(response.body, :read) }
|
35
|
-
default_handler(:ok, :created) {|response| DropletMapping.extract_single(response.body, :read) }
|
34
|
+
default_handler(422) { |response| ErrorMapping.extract_single(response.body, :read) }
|
35
|
+
default_handler(:ok, :created) { |response| DropletMapping.extract_single(response.body, :read) }
|
36
36
|
|
37
37
|
# Defining actions will create instance methods on the resource class to call them.
|
38
38
|
action :find do
|
39
39
|
verb :get # get is assumed if this is omitted
|
40
40
|
path '/droplets/:id'
|
41
|
-
handler(200) {|response| DropletMapping.extract_single(response.body, :read) }
|
41
|
+
handler(200) { |response| DropletMapping.extract_single(response.body, :read) }
|
42
42
|
end
|
43
43
|
|
44
44
|
action :all do
|
45
45
|
path '/droplets'
|
46
|
-
handler(200) {|body| DropletMapping.extract_collection(body, :read) }
|
46
|
+
handler(200) { |body| DropletMapping.extract_collection(body, :read) }
|
47
47
|
end
|
48
48
|
|
49
49
|
action :create do
|
50
50
|
path '/droplets'
|
51
51
|
verb :post
|
52
|
-
body {|object| DropletMapping.representation_for(:create, object) } # Generate a response body from a passed object
|
53
|
-
handler(202) {|response| DropletMapping.extract_single(response.body, :read) }
|
52
|
+
body { |object| DropletMapping.representation_for(:create, object) } # Generate a response body from a passed object
|
53
|
+
handler(202) { |response| DropletMapping.extract_single(response.body, :read) }
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -86,6 +86,56 @@ single_droplet = resource.find(id: 123)
|
|
86
86
|
create = resource.create(Droplet.new)
|
87
87
|
```
|
88
88
|
|
89
|
+
## Scope
|
90
|
+
|
91
|
+
ResourceKit classes give you the option to pass in an optional scope object, so that you may interact with the resource with it that way.
|
92
|
+
|
93
|
+
For example, you may want to use this for nested resources:
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
class CommentResource < ResourceKit::Resource
|
97
|
+
resources do
|
98
|
+
action :all do
|
99
|
+
path { "/users/#{user_id}/comments" }
|
100
|
+
handler(200) { |resp| CommentMapping.extract_collection(resp.body, :read) }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def user_id
|
105
|
+
scope.user_id
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
user = User.find(123)
|
110
|
+
resource = CommentResource.new(connection, user)
|
111
|
+
comments = resource.all #=> Will fetch from /users/123/comments
|
112
|
+
```
|
113
|
+
|
114
|
+
## Test Helpers
|
115
|
+
|
116
|
+
ResourceKit supplys test helpers that assist in certain things you'd want your resource classes to do.
|
117
|
+
|
118
|
+
Make sure you:
|
119
|
+
|
120
|
+
require 'resource_kit/testing'
|
121
|
+
|
122
|
+
Testing a certain action:
|
123
|
+
|
124
|
+
```ruby
|
125
|
+
# Tag the spec with resource_kit to bring in the helpers
|
126
|
+
RSpec.describe MyResourceClass, resource_kit: true do
|
127
|
+
it 'has an all action' do
|
128
|
+
expect(MyResourceClass).to have_action(:all).that_handles(:ok, :no_content).at_path('/users')
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'handles a 201 with response body' do
|
132
|
+
expect(MyResourceClass).to handle_response(:create).with(status: 201, body: '{"users":[]}') do |handled|
|
133
|
+
expect(handled).to all(be_kind_of(User))
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
```
|
138
|
+
|
89
139
|
### Nice to have's
|
90
140
|
|
91
141
|
Things we've thought about but just haven't implemented are:
|
@@ -36,7 +36,7 @@ class DropletResource < ResourceKit::Resource
|
|
36
36
|
action :create do
|
37
37
|
verb :post
|
38
38
|
path '/v2/droplets'
|
39
|
-
body {|object| DropletMapping.representation_for(:create, object) }
|
39
|
+
body { |object| DropletMapping.representation_for(:create, object) }
|
40
40
|
handler(202) { |response| DropletMapping.extract_single(response.body, :read) }
|
41
41
|
end
|
42
42
|
end
|
data/lib/resource_kit/action.rb
CHANGED
@@ -14,8 +14,10 @@ module ResourceKit
|
|
14
14
|
@verb
|
15
15
|
end
|
16
16
|
|
17
|
-
def path(path = nil)
|
17
|
+
def path(path = nil, &block)
|
18
|
+
raise "You must pass either a block or a string for paths" if path and block_given?
|
18
19
|
@path = path if path
|
20
|
+
@path = block if block_given?
|
19
21
|
@path
|
20
22
|
end
|
21
23
|
|
@@ -41,5 +43,22 @@ module ResourceKit
|
|
41
43
|
@body_handler = block if block_given?
|
42
44
|
@body_handler
|
43
45
|
end
|
46
|
+
|
47
|
+
def hooks
|
48
|
+
@hooks ||= {}
|
49
|
+
end
|
50
|
+
|
51
|
+
def before_request(method_name = nil, &block)
|
52
|
+
hooks[:before] ||= []
|
53
|
+
|
54
|
+
if block_given?
|
55
|
+
hooks[:before] << block
|
56
|
+
else
|
57
|
+
raise "Must include a method name" unless method_name
|
58
|
+
hooks[:before] << method_name
|
59
|
+
end
|
60
|
+
|
61
|
+
nil
|
62
|
+
end
|
44
63
|
end
|
45
64
|
end
|
@@ -1,21 +1,22 @@
|
|
1
1
|
module ResourceKit
|
2
2
|
class ActionInvoker
|
3
|
-
attr_reader :action, :connection, :args, :options
|
3
|
+
attr_reader :action, :connection, :args, :options, :resource
|
4
4
|
|
5
|
-
def initialize(action,
|
5
|
+
def initialize(action, resource, *args)
|
6
6
|
@action = action
|
7
|
-
@
|
7
|
+
@resource = resource
|
8
|
+
@connection = resource.connection
|
8
9
|
@args = args
|
9
10
|
@options = args.last.kind_of?(Hash) ? args.last : {}
|
10
11
|
end
|
11
12
|
|
12
|
-
def self.call(action,
|
13
|
-
new(action,
|
13
|
+
def self.call(action, resource, *args)
|
14
|
+
new(action, resource, *args).handle_response
|
14
15
|
end
|
15
16
|
|
16
17
|
def handle_response
|
17
18
|
if handler = action.handlers[response.status]
|
18
|
-
|
19
|
+
resource.instance_exec(response, &handler)
|
19
20
|
else
|
20
21
|
response.body
|
21
22
|
end
|
@@ -30,18 +31,28 @@ module ResourceKit
|
|
30
31
|
|
31
32
|
raise ArgumentError, "Verb '#{action.verb}' is not allowed" unless action.verb.in?(ALLOWED_VERBS)
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
request.body = construct_body
|
37
|
-
end
|
38
|
-
else
|
39
|
-
@response = connection.send(action.verb, resolver.resolve(options))
|
34
|
+
@response = connection.send(action.verb, resolver.resolve(options)) do |request|
|
35
|
+
request.body = construct_body if action.body and action.verb.in?([:post, :put, :patch])
|
36
|
+
append_hooks(:before, request)
|
40
37
|
end
|
41
38
|
end
|
42
39
|
|
43
40
|
def resolver
|
44
|
-
|
41
|
+
path = action.path.kind_of?(Proc) ? resource.instance_eval(&action.path) : action.path
|
42
|
+
EndpointResolver.new(path: path, query_param_keys: action.query_keys)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def append_hooks(hook_type, request)
|
48
|
+
(action.hooks[hook_type] || []).each do |hook|
|
49
|
+
case hook
|
50
|
+
when Proc
|
51
|
+
resource.instance_exec(*args, request, &hook)
|
52
|
+
when Symbol
|
53
|
+
resource.send(hook, *args, request)
|
54
|
+
end
|
55
|
+
end
|
45
56
|
end
|
46
57
|
end
|
47
58
|
end
|
@@ -2,17 +2,21 @@ module ResourceKit
|
|
2
2
|
class Resource
|
3
3
|
class_attribute :_resources
|
4
4
|
|
5
|
-
attr_reader :connection
|
5
|
+
attr_reader :connection, :scope
|
6
6
|
|
7
|
-
def initialize(connection)
|
7
|
+
def initialize(connection: nil, scope: nil)
|
8
8
|
@connection = connection
|
9
|
+
@scope = scope
|
9
10
|
end
|
10
11
|
|
11
12
|
def self.resources(&block)
|
12
13
|
self._resources ||= ResourceCollection.new
|
13
|
-
self._resources.instance_eval(&block) if block_given?
|
14
14
|
|
15
|
-
|
15
|
+
if block_given?
|
16
|
+
self._resources.instance_eval(&block)
|
17
|
+
MethodFactory.construct(self, self._resources)
|
18
|
+
end
|
19
|
+
|
16
20
|
self._resources
|
17
21
|
end
|
18
22
|
|
@@ -11,7 +11,7 @@ module ResourceKit
|
|
11
11
|
action = Action.new(name, *parse_verb_and_path(verb_and_path))
|
12
12
|
action.handlers.merge!(default_handlers.dup)
|
13
13
|
action.instance_eval(&block) if block_given?
|
14
|
-
action.tap {|a| self << a }
|
14
|
+
action.tap { |a| self << a }
|
15
15
|
end
|
16
16
|
|
17
17
|
def default_handler(*response_codes, &block)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ResourceKit
|
2
|
+
module Testing
|
3
|
+
class ActionHandlerMatchers
|
4
|
+
ResponseStub = Class.new(OpenStruct)
|
5
|
+
|
6
|
+
attr_reader :action, :response_stub
|
7
|
+
|
8
|
+
def initialize(action)
|
9
|
+
@action = action
|
10
|
+
end
|
11
|
+
|
12
|
+
def with(options, &block)
|
13
|
+
@response_stub = ResponseStub.new(options)
|
14
|
+
@handled_block = block
|
15
|
+
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def matches?(subject, &block)
|
20
|
+
@handled_block ||= block
|
21
|
+
action = subject.resources.find_action(self.action)
|
22
|
+
return false unless action
|
23
|
+
|
24
|
+
status_code = response_stub.status || 200
|
25
|
+
return false unless action.handlers[status_code]
|
26
|
+
|
27
|
+
handled_response = action.handlers[status_code].call(response_stub)
|
28
|
+
@handled_block.call(handled_response)
|
29
|
+
|
30
|
+
true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module ResourceKit
|
2
|
+
module Testing
|
3
|
+
class HaveActionMatchers
|
4
|
+
attr_reader :action, :path, :verb
|
5
|
+
|
6
|
+
def initialize(action)
|
7
|
+
@action = action
|
8
|
+
end
|
9
|
+
|
10
|
+
def that_handles(*codes)
|
11
|
+
codes.each do |code|
|
12
|
+
handler_codes << StatusCodeMapper.code_for(code)
|
13
|
+
end
|
14
|
+
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def at_path(path)
|
19
|
+
@path = path
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def with_verb(verb)
|
24
|
+
@verb = verb
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
def matches?(subject)
|
29
|
+
action = subject.resources.find_action(self.action)
|
30
|
+
return false unless action
|
31
|
+
|
32
|
+
%i(check_keys check_path check_verb).inject(true) do |rv, method_name|
|
33
|
+
break false unless send(method_name, action)
|
34
|
+
true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def handler_codes
|
39
|
+
@handler_codes ||= []
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def check_keys(action)
|
45
|
+
keys = action.handlers.keys
|
46
|
+
|
47
|
+
if !handler_codes.empty?
|
48
|
+
handler_codes.each do |handler_code|
|
49
|
+
return false unless keys.include?(handler_code)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
def check_path(action)
|
57
|
+
return true unless self.path
|
58
|
+
action.path == self.path
|
59
|
+
end
|
60
|
+
|
61
|
+
def check_verb(action)
|
62
|
+
return true unless self.verb
|
63
|
+
checked_verb = self.verb.kind_of?(String) ? self.verb.downcase.to_sym : self.verb
|
64
|
+
action.verb == checked_verb
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'resource_kit/testing/have_action_matchers'
|
2
|
+
require 'resource_kit/testing/action_handler_matchers'
|
3
|
+
|
4
|
+
module ResourceKit
|
5
|
+
module Testing
|
6
|
+
def have_action(action)
|
7
|
+
HaveActionMatchers.new(action)
|
8
|
+
end
|
9
|
+
|
10
|
+
def handle_response(action, &block)
|
11
|
+
ActionHandlerMatchers.new(action)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
if defined?(RSpec)
|
17
|
+
RSpec.configure do |config|
|
18
|
+
config.include ResourceKit::Testing, resource_kit: true
|
19
|
+
end
|
20
|
+
end
|
data/lib/resource_kit/version.rb
CHANGED
data/resource_kit.gemspec
CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.description = ''
|
13
13
|
spec.homepage = "https://github.com/digitaloceancloud/resource_kit"
|
14
14
|
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = '>= 2.0'
|
15
16
|
|
16
17
|
spec.files = `git ls-files -z`.split("\x0")
|
17
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
@@ -26,5 +27,6 @@ Gem::Specification.new do |spec|
|
|
26
27
|
spec.add_development_dependency "rake"
|
27
28
|
spec.add_development_dependency "rspec", "~> 3.0"
|
28
29
|
spec.add_development_dependency "webmock", "~> 1.18.0"
|
29
|
-
spec.add_development_dependency "kartograph", "~> 0"
|
30
|
+
spec.add_development_dependency "kartograph", "~> 0.0.8"
|
31
|
+
spec.add_development_dependency "pry", "~> 0.10.1"
|
30
32
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class DummyResourceActions < ResourceKit::Resource
|
4
|
+
resources do
|
5
|
+
action :dummy, 'GET /dummy' do
|
6
|
+
handler(200) { |resp| resp.body.upcase }
|
7
|
+
end
|
8
|
+
|
9
|
+
action :headered, 'GET /headered' do
|
10
|
+
before_request { |req| req.headers['Added-Header'] = self.value }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def value
|
15
|
+
scope.value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
RSpec.describe 'Resource Actions' do
|
20
|
+
let(:connection) { Faraday.new { |b| b.adapter :test, stubs } }
|
21
|
+
let(:scoped) { double('scope', value: 'bunk') }
|
22
|
+
let(:stubs) do
|
23
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
24
|
+
stub.get('/dummy') { |env| [200, {}, 'dummies'] }
|
25
|
+
stub.get('/headered') { |env| [200, {}, env[:request_headers]['Added-Header']] }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'Retrieving /dummy returns the body as uppercased' do
|
30
|
+
resource = DummyResourceActions.new(connection: connection, scope: scoped)
|
31
|
+
response = resource.dummy
|
32
|
+
expect(response).to eq('DUMMIES')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'adds the header before the request happens' do
|
36
|
+
resource = DummyResourceActions.new(connection: connection, scope: scoped)
|
37
|
+
response = resource.headered
|
38
|
+
|
39
|
+
expect(response).to eq(scoped.value)
|
40
|
+
end
|
41
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe ResourceKit::ActionInvoker do
|
4
|
-
let(:connection) { Faraday.new {|b| b.adapter :test, stubs } }
|
4
|
+
let(:connection) { Faraday.new { |b| b.adapter :test, stubs } }
|
5
5
|
let(:stubs) do
|
6
6
|
Faraday::Adapter::Test::Stubs.new do |stub|
|
7
7
|
stub.get('/users') { |env| [200, {}, 'all users'] }
|
@@ -9,25 +9,35 @@ RSpec.describe ResourceKit::ActionInvoker do
|
|
9
9
|
stub.get('/users/12') { |env| [200, {}, 'user 12'] }
|
10
10
|
stub.post('/users') { |env| [200, {}, env[:body]] }
|
11
11
|
stub.get('/paged') { |env| [200, {}, env[:url].to_s] }
|
12
|
+
stub.get('/before_hooks') { |env| [200, {}, env[:request_headers]['Owner-Id']] }
|
13
|
+
stub.get('/block_based') { |env| [200, {}, 'block based path'] }
|
12
14
|
end
|
13
15
|
end
|
14
16
|
let(:action) { ResourceKit::Action.new(:find) }
|
17
|
+
let(:resource) { double('resource instance', connection: connection) }
|
15
18
|
|
16
19
|
describe '.call' do
|
17
20
|
it 'performs a request to the specfied URL' do
|
18
21
|
action.verb :get
|
19
22
|
action.path '/users'
|
20
23
|
|
21
|
-
result = ResourceKit::ActionInvoker.call(action,
|
24
|
+
result = ResourceKit::ActionInvoker.call(action, resource)
|
22
25
|
|
23
26
|
expect(result).to eq('all users')
|
24
27
|
end
|
25
28
|
|
29
|
+
it 'performs a request to the correct url when using a block for path' do
|
30
|
+
action.path { '/block_based' }
|
31
|
+
result = ResourceKit::ActionInvoker.call(action, resource)
|
32
|
+
|
33
|
+
expect(result).to eq('block based path')
|
34
|
+
end
|
35
|
+
|
26
36
|
it 'substitues params on call' do
|
27
37
|
action.verb :get
|
28
38
|
action.path '/users/:id'
|
29
39
|
|
30
|
-
result = ResourceKit::ActionInvoker.call(action,
|
40
|
+
result = ResourceKit::ActionInvoker.call(action, resource, id: 12)
|
31
41
|
expect(result).to eq('user 12')
|
32
42
|
end
|
33
43
|
|
@@ -35,9 +45,9 @@ RSpec.describe ResourceKit::ActionInvoker do
|
|
35
45
|
it 'returns the handler block' do
|
36
46
|
action.verb :get
|
37
47
|
action.path '/users'
|
38
|
-
action.handler(200) {|response| 'changed' }
|
48
|
+
action.handler(200) { |response| 'changed' }
|
39
49
|
|
40
|
-
result = ResourceKit::ActionInvoker.call(action,
|
50
|
+
result = ResourceKit::ActionInvoker.call(action, resource)
|
41
51
|
|
42
52
|
expect(result).to eq('changed')
|
43
53
|
end
|
@@ -45,9 +55,9 @@ RSpec.describe ResourceKit::ActionInvoker do
|
|
45
55
|
it 'uses the correct handler on status codes' do
|
46
56
|
action.verb :get
|
47
57
|
action.path '/users/bad_page'
|
48
|
-
action.handler(404) {|response| '404ed' }
|
58
|
+
action.handler(404) { |response| '404ed' }
|
49
59
|
|
50
|
-
result = ResourceKit::ActionInvoker.call(action,
|
60
|
+
result = ResourceKit::ActionInvoker.call(action, resource)
|
51
61
|
expect(result).to eq('404ed')
|
52
62
|
end
|
53
63
|
end
|
@@ -56,18 +66,18 @@ RSpec.describe ResourceKit::ActionInvoker do
|
|
56
66
|
it 'uses the body handler when present' do
|
57
67
|
action.verb :post
|
58
68
|
action.path '/users'
|
59
|
-
action.body {|object| 'i am a banana' }
|
69
|
+
action.body { |object| 'i am a banana' }
|
60
70
|
|
61
|
-
result = ResourceKit::ActionInvoker.call(action,
|
71
|
+
result = ResourceKit::ActionInvoker.call(action, resource, 'echo me')
|
62
72
|
expect(result).to eq('i am a banana')
|
63
73
|
end
|
64
74
|
|
65
75
|
it 'uses the body handler with multiple arity when present' do
|
66
76
|
action.verb :post
|
67
77
|
action.path '/users'
|
68
|
-
action.body {|first, second| first + second }
|
78
|
+
action.body { |first, second| first + second }
|
69
79
|
|
70
|
-
result = ResourceKit::ActionInvoker.call(action,
|
80
|
+
result = ResourceKit::ActionInvoker.call(action, resource, 'echo me', ' another')
|
71
81
|
expect(result).to eq('echo me another')
|
72
82
|
end
|
73
83
|
end
|
@@ -77,11 +87,61 @@ RSpec.describe ResourceKit::ActionInvoker do
|
|
77
87
|
action.query_keys :per_page, :page
|
78
88
|
action.path '/paged'
|
79
89
|
|
80
|
-
result = ResourceKit::ActionInvoker.call(action,
|
90
|
+
result = ResourceKit::ActionInvoker.call(action, resource, page: 3, per_page: 300)
|
81
91
|
addressed = Addressable::URI.parse(result)
|
82
92
|
|
83
93
|
expect(addressed.query_values).to include('per_page' => '300', 'page' => '3')
|
84
94
|
end
|
85
95
|
end
|
96
|
+
|
97
|
+
context 'for actions that have before request hooks' do
|
98
|
+
it 'calls the before request with the request object' do
|
99
|
+
action.path '/before_hooks'
|
100
|
+
action.verb :get
|
101
|
+
action.before_request { |req| req.headers['Owner-Id'] = 'bojangles' }
|
102
|
+
|
103
|
+
result = ResourceKit::ActionInvoker.call(action, resource)
|
104
|
+
expect(result).to eq('bojangles')
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'calls the before request with the request object and arguments' do
|
108
|
+
action.path '/before_hooks'
|
109
|
+
action.verb :get
|
110
|
+
action.before_request { |one, two, req| req.headers['Owner-Id'] = "#{one} #{two}" }
|
111
|
+
|
112
|
+
result = ResourceKit::ActionInvoker.call(action, resource, 'one', 'two')
|
113
|
+
expect(result).to eq('one two')
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'for passing a symbol' do
|
117
|
+
it 'calls the method on the context of the action' do
|
118
|
+
def resource.kickit(request)
|
119
|
+
request.headers['Owner-Id'] = 'btabes'
|
120
|
+
end
|
121
|
+
|
122
|
+
action.path '/before_hooks'
|
123
|
+
action.verb :get
|
124
|
+
action.before_request(:kickit)
|
125
|
+
|
126
|
+
invoker = ResourceKit::ActionInvoker.new(action, resource)
|
127
|
+
|
128
|
+
expect(invoker.handle_response).to eq('btabes')
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'calls the action with arguments passed' do
|
132
|
+
def resource.kickit(one, two, request)
|
133
|
+
request.headers['Owner-Id'] = "#{one} #{two}"
|
134
|
+
end
|
135
|
+
|
136
|
+
action.path '/before_hooks'
|
137
|
+
action.verb :get
|
138
|
+
action.before_request(:kickit)
|
139
|
+
|
140
|
+
invoker = ResourceKit::ActionInvoker.new(action, resource, 'bobby', 'tables')
|
141
|
+
|
142
|
+
expect(invoker.handle_response).to eq('bobby tables')
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
86
146
|
end
|
87
147
|
end
|
@@ -24,6 +24,14 @@ RSpec.describe ResourceKit::Action do
|
|
24
24
|
action.path '/something/sammy'
|
25
25
|
expect(action.path).to eq('/something/sammy')
|
26
26
|
end
|
27
|
+
|
28
|
+
it 'sets the path to a block when passed' do
|
29
|
+
action = described_class.new(:find)
|
30
|
+
proc = Proc.new { '/users/:id/comments' }
|
31
|
+
action.path(&proc)
|
32
|
+
|
33
|
+
expect(action.path).to be(proc)
|
34
|
+
end
|
27
35
|
end
|
28
36
|
|
29
37
|
describe '#handler' do
|
@@ -46,7 +54,7 @@ RSpec.describe ResourceKit::Action do
|
|
46
54
|
|
47
55
|
describe '#body' do
|
48
56
|
it 'stores a proc for handling requests with bodies' do
|
49
|
-
handler = Proc.new {|object| 'whut whut' }
|
57
|
+
handler = Proc.new { |object| 'whut whut' }
|
50
58
|
action.body(&handler)
|
51
59
|
|
52
60
|
expect(action.body).to be(handler)
|
@@ -59,4 +67,21 @@ RSpec.describe ResourceKit::Action do
|
|
59
67
|
expect(action.query_keys).to include(:per_page, :page)
|
60
68
|
end
|
61
69
|
end
|
70
|
+
|
71
|
+
describe '#before_request' do
|
72
|
+
context 'with a block' do
|
73
|
+
it 'sets a block to happen before the request happens' do
|
74
|
+
proc = Proc.new {}
|
75
|
+
action.before_request(&proc)
|
76
|
+
expect(action.hooks[:before]).to include(proc)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'with a symbol' do
|
81
|
+
it 'adds the symbol to the before hooks' do
|
82
|
+
action.before_request(:foo)
|
83
|
+
expect(action.hooks[:before]).to include(:foo)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
62
87
|
end
|
@@ -44,7 +44,7 @@ RSpec.describe ResourceKit::MethodFactory do
|
|
44
44
|
instance = klass.new
|
45
45
|
instance.connection = double('connection')
|
46
46
|
instance.bunk('something', 'something else')
|
47
|
-
expect(invoker).to have_received(:call).with(action, instance
|
47
|
+
expect(invoker).to have_received(:call).with(action, instance, 'something', 'something else')
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
@@ -5,7 +5,7 @@ RSpec.describe ResourceKit::ResourceCollection do
|
|
5
5
|
|
6
6
|
describe '#default_handler' do
|
7
7
|
it 'adds the passed black to a hash of handlers on the resource collection' do
|
8
|
-
handler_block = Proc.new {|b| 'whut whut' }
|
8
|
+
handler_block = Proc.new { |b| 'whut whut' }
|
9
9
|
collection.default_handler(:ok, :no_content, &handler_block)
|
10
10
|
|
11
11
|
expect(collection.default_handlers[200]).to eq(handler_block)
|
@@ -15,7 +15,7 @@ RSpec.describe ResourceKit::ResourceCollection do
|
|
15
15
|
|
16
16
|
describe '#action' do
|
17
17
|
it 'yields an action to the block' do
|
18
|
-
expect {|b| collection.action(:all, &b) }.to yield_with_args(instance_of(ResourceKit::Action))
|
18
|
+
expect { |b| collection.action(:all, &b) }.to yield_with_args(instance_of(ResourceKit::Action))
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'adds the action to the collection' do
|
@@ -31,7 +31,7 @@ RSpec.describe ResourceKit::ResourceCollection do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
context 'when default handlers have been specified on the collection' do
|
34
|
-
let(:handler) { Proc.new {|response| 'sure' } }
|
34
|
+
let(:handler) { Proc.new { |response| 'sure' } }
|
35
35
|
|
36
36
|
before { collection.default_handler(:ok, &handler) }
|
37
37
|
|
@@ -20,7 +20,7 @@ RSpec.describe ResourceKit::Resource do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
subject(:droplet_resource) { DropletResource.new
|
23
|
+
subject(:droplet_resource) { DropletResource.new }
|
24
24
|
|
25
25
|
it "defines the action method" do
|
26
26
|
expect(droplet_resource).to respond_to(:find)
|
@@ -31,10 +31,20 @@ RSpec.describe ResourceKit::Resource do
|
|
31
31
|
describe '#initialize' do
|
32
32
|
it 'initializes with a connection' do
|
33
33
|
faraday = Faraday.new(url: 'http://lol.com')
|
34
|
-
instance = ResourceKit::Resource.new(faraday)
|
34
|
+
instance = ResourceKit::Resource.new(connection: faraday)
|
35
35
|
|
36
36
|
expect(instance.connection).to be(faraday)
|
37
37
|
end
|
38
|
+
|
39
|
+
it 'initializes with an optional scope object' do
|
40
|
+
connection = double('conn')
|
41
|
+
scope = double('scope')
|
42
|
+
|
43
|
+
instance = ResourceKit::Resource.new(connection: connection, scope: scope)
|
44
|
+
|
45
|
+
expect(instance.connection).to be(connection)
|
46
|
+
expect(instance.scope).to be(scope)
|
47
|
+
end
|
38
48
|
end
|
39
49
|
|
40
50
|
describe '#action' do
|
@@ -47,7 +57,7 @@ RSpec.describe ResourceKit::Resource do
|
|
47
57
|
end
|
48
58
|
end
|
49
59
|
|
50
|
-
instance = DummyResource.new(faraday)
|
60
|
+
instance = DummyResource.new(connection: faraday)
|
51
61
|
|
52
62
|
expect(instance.action(:find)).to be_kind_of(ResourceKit::Action)
|
53
63
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
RSpec.describe ResourceKit::Testing::ActionHandlerMatchers do
|
5
|
+
let(:resource_class) { Class.new(ResourceKit::Resource) }
|
6
|
+
subject(:matcher) { described_class.new(:all) }
|
7
|
+
|
8
|
+
describe '#initialize' do
|
9
|
+
it 'initializes with a resource class' do
|
10
|
+
action = :all
|
11
|
+
instance = described_class.new(action)
|
12
|
+
expect(instance.action).to be(action)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#with' do
|
17
|
+
it 'sets the passed response params' do
|
18
|
+
matcher.with(status: 200, body: 'Hello World')
|
19
|
+
expect(matcher.response_stub.status).to eq(200)
|
20
|
+
expect(matcher.response_stub.body).to eq('Hello World')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#matches?' do
|
25
|
+
it 'matches when the resource handles the block correctly' do
|
26
|
+
resource_class.resources.action :all, 'GET /all' do
|
27
|
+
handler(200) { |response| JSON.load(response.body) }
|
28
|
+
end
|
29
|
+
|
30
|
+
change_var = nil
|
31
|
+
matcher.with(status: 200, body: '{"hello": "world"}') do |handled|
|
32
|
+
expect(handled['hello']).to eq('world')
|
33
|
+
change_var = true
|
34
|
+
end
|
35
|
+
|
36
|
+
expect(matcher.matches?(resource_class)).to be_truthy
|
37
|
+
expect(change_var).to be(true)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe ResourceKit::Testing::HaveActionMatchers do
|
4
|
+
describe '#initialize' do
|
5
|
+
it 'initializes with a resource class' do
|
6
|
+
action = :all
|
7
|
+
instance = described_class.new(action)
|
8
|
+
expect(instance.action).to be(action)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#that_handles' do
|
13
|
+
subject(:testing_matcher) { described_class.new(:all) }
|
14
|
+
|
15
|
+
it 'returns itself' do
|
16
|
+
expect(testing_matcher.that_handles(200)).to be(testing_matcher)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'accepts a status code' do
|
20
|
+
testing_matcher.that_handles(200)
|
21
|
+
expect(testing_matcher.handler_codes).to include(200)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'accepts a magic status code' do
|
25
|
+
testing_matcher.that_handles(:ok)
|
26
|
+
expect(testing_matcher.handler_codes).to include(200)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'accepts multiple status codes' do
|
30
|
+
testing_matcher.that_handles(:ok, 201)
|
31
|
+
expect(testing_matcher.handler_codes).to include(200, 201)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#at_path' do
|
36
|
+
subject(:testing_matcher) { described_class.new(:all) }
|
37
|
+
|
38
|
+
it 'sets the path we\'re specing' do
|
39
|
+
testing_matcher.at_path('/hello')
|
40
|
+
expect(testing_matcher.path).to eq('/hello')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns itself' do
|
44
|
+
expect(testing_matcher.at_path('/')).to be(testing_matcher)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#with_verb' do
|
49
|
+
subject(:testing_matcher) { described_class.new(:all) }
|
50
|
+
|
51
|
+
it 'sets the verb to test for' do
|
52
|
+
testing_matcher.with_verb('POST')
|
53
|
+
expect(testing_matcher.verb).to eq('POST')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#matches?' do
|
58
|
+
subject(:testing_matcher) { described_class.new(:all) }
|
59
|
+
|
60
|
+
context 'for a resource that has the defined action' do
|
61
|
+
let(:resource_class) { Class.new(ResourceKit::Resource) }
|
62
|
+
|
63
|
+
it 'matches with both code and path' do
|
64
|
+
resource_class.resources do
|
65
|
+
action :all, 'GET /hello' do
|
66
|
+
handler(200) { }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
matcher = described_class.new(:all)
|
71
|
+
matcher.that_handles(:ok).at_path('/hello').with_verb('GET')
|
72
|
+
|
73
|
+
expect(matcher.matches?(resource_class)).to be_truthy
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'matches with only code' do
|
77
|
+
resource_class.resources do
|
78
|
+
action :all, 'GET /hello' do
|
79
|
+
handler(200) { }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
matcher = described_class.new(:all)
|
84
|
+
matcher.that_handles(:ok)
|
85
|
+
|
86
|
+
expect(matcher.matches?(resource_class)).to be_truthy
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'matches with only path' do
|
90
|
+
resource_class.resources { action :all, 'GET /hello' }
|
91
|
+
|
92
|
+
matcher = described_class.new(:all)
|
93
|
+
matcher.at_path('/hello')
|
94
|
+
|
95
|
+
expect(matcher.matches?(resource_class)).to be_truthy
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'matches with only the verb' do
|
99
|
+
resource_class.resources { action :all, 'GET /hello' }
|
100
|
+
|
101
|
+
matcher = described_class.new(:all)
|
102
|
+
matcher.with_verb('GET')
|
103
|
+
|
104
|
+
expect(matcher.matches?(resource_class)).to be_truthy
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/spec/spec_helper.rb
CHANGED
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.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Ross
|
@@ -9,120 +9,134 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-08-
|
12
|
+
date: 2014-08-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: activesupport
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '3.0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '3.0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: addressable
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - ~>
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: 2.3.6
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - ~>
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: 2.3.6
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: bundler
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - ~>
|
60
|
+
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '1.6'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - ~>
|
67
|
+
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '1.6'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rake
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- -
|
81
|
+
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: rspec
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- - ~>
|
88
|
+
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: '3.0'
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- - ~>
|
95
|
+
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '3.0'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: webmock
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- - ~>
|
102
|
+
- - "~>"
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: 1.18.0
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- - ~>
|
109
|
+
- - "~>"
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: 1.18.0
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
113
|
name: kartograph
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
|
-
- - ~>
|
116
|
+
- - "~>"
|
117
117
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
118
|
+
version: 0.0.8
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
|
-
- - ~>
|
123
|
+
- - "~>"
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
125
|
+
version: 0.0.8
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: pry
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 0.10.1
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 0.10.1
|
126
140
|
description: ''
|
127
141
|
email:
|
128
142
|
- rross@digitalocean.com
|
@@ -131,8 +145,8 @@ executables: []
|
|
131
145
|
extensions: []
|
132
146
|
extra_rdoc_files: []
|
133
147
|
files:
|
134
|
-
- .gitignore
|
135
|
-
- .rspec
|
148
|
+
- ".gitignore"
|
149
|
+
- ".rspec"
|
136
150
|
- Gemfile
|
137
151
|
- LICENSE.txt
|
138
152
|
- README.md
|
@@ -146,8 +160,12 @@ files:
|
|
146
160
|
- lib/resource_kit/resource.rb
|
147
161
|
- lib/resource_kit/resource_collection.rb
|
148
162
|
- lib/resource_kit/status_code_mapper.rb
|
163
|
+
- lib/resource_kit/testing.rb
|
164
|
+
- lib/resource_kit/testing/action_handler_matchers.rb
|
165
|
+
- lib/resource_kit/testing/have_action_matchers.rb
|
149
166
|
- lib/resource_kit/version.rb
|
150
167
|
- resource_kit.gemspec
|
168
|
+
- spec/integration/resource_actions_spec.rb
|
151
169
|
- spec/lib/resource_kit/action_invoker_spec.rb
|
152
170
|
- spec/lib/resource_kit/action_spec.rb
|
153
171
|
- spec/lib/resource_kit/endpoint_resolver_spec.rb
|
@@ -155,6 +173,8 @@ files:
|
|
155
173
|
- spec/lib/resource_kit/resource_collection_spec.rb
|
156
174
|
- spec/lib/resource_kit/resource_spec.rb
|
157
175
|
- spec/lib/resource_kit/status_code_mapper_spec.rb
|
176
|
+
- spec/lib/resource_kit/testing/action_handler_matchers_spec.rb
|
177
|
+
- spec/lib/resource_kit/testing/have_action_matchers_spec.rb
|
158
178
|
- spec/spec_helper.rb
|
159
179
|
homepage: https://github.com/digitaloceancloud/resource_kit
|
160
180
|
licenses:
|
@@ -166,12 +186,12 @@ require_paths:
|
|
166
186
|
- lib
|
167
187
|
required_ruby_version: !ruby/object:Gem::Requirement
|
168
188
|
requirements:
|
169
|
-
- -
|
189
|
+
- - ">="
|
170
190
|
- !ruby/object:Gem::Version
|
171
|
-
version: '0'
|
191
|
+
version: '2.0'
|
172
192
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
193
|
requirements:
|
174
|
-
- -
|
194
|
+
- - ">="
|
175
195
|
- !ruby/object:Gem::Version
|
176
196
|
version: '0'
|
177
197
|
requirements: []
|
@@ -182,6 +202,7 @@ specification_version: 4
|
|
182
202
|
summary: Resource Kit provides tools to aid in making API Clients. Such as URL resolving,
|
183
203
|
Request / Response layer, and more.
|
184
204
|
test_files:
|
205
|
+
- spec/integration/resource_actions_spec.rb
|
185
206
|
- spec/lib/resource_kit/action_invoker_spec.rb
|
186
207
|
- spec/lib/resource_kit/action_spec.rb
|
187
208
|
- spec/lib/resource_kit/endpoint_resolver_spec.rb
|
@@ -189,4 +210,6 @@ test_files:
|
|
189
210
|
- spec/lib/resource_kit/resource_collection_spec.rb
|
190
211
|
- spec/lib/resource_kit/resource_spec.rb
|
191
212
|
- spec/lib/resource_kit/status_code_mapper_spec.rb
|
213
|
+
- spec/lib/resource_kit/testing/action_handler_matchers_spec.rb
|
214
|
+
- spec/lib/resource_kit/testing/have_action_matchers_spec.rb
|
192
215
|
- spec/spec_helper.rb
|