rescue-dog 0.3.4 → 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/README.md +57 -3
- data/lib/rescue/controller.rb +1 -0
- data/lib/rescue/controllers/action.rb +8 -4
- data/lib/rescue/errors.rb +16 -0
- data/lib/rescue/version.rb +1 -1
- data/lib/rescue-dog.rb +1 -0
- data/rescue-dog.gemspec +2 -2
- data/spec/rescue/controller_spec.rb +107 -54
- data/spec/rescue/controllers/action_spec.rb +84 -4
- data/spec/spec_helper.rb +2 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94b0003e3a52320379af227d77392979bc89d0da
|
4
|
+
data.tar.gz: 9a998aedbc2b68dd06211713b6b4306d32d40ab8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5430d1c18141a9f6cff373f5b98efcf6c1cd4dbb7aa6cd877c963c57f6fee11b93e2ff49a6f0eae3ae096e6533b6b49af1432a31f1cba4e860332c686cda67e4
|
7
|
+
data.tar.gz: 178688de7e29b2fdbfd99e191a4681b69e3a2bca222635e251284f7215ec6afeed236a43f517fc1527c72ddffad87430e78f51048a8ec31e5e97c4c82330870a
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -26,19 +26,73 @@ Or install it yourself as:
|
|
26
26
|
$ gem install rescue-dog
|
27
27
|
```
|
28
28
|
|
29
|
-
##
|
29
|
+
## Declare CRUD Actions
|
30
30
|
|
31
31
|
1. Include `Rescue::Controller` (Rescue::Controller::Static` or `Rescue::Controller::Dynamic`).
|
32
32
|
2. Call `rescue_controller` method.
|
33
|
+
3. Declare `xxx_params` method. (cf. Rails 4 / Strong Parameters)
|
33
34
|
|
34
|
-
###
|
35
|
+
### Simple CRUD Actions
|
35
36
|
|
36
37
|
```ruby
|
37
38
|
class UsersController < ApplicationController
|
38
39
|
rescue_controller User, :new, :edit, :show,
|
39
40
|
create: { render: lambda { redirect_to edit_user_path(@user) } ,rescue: lambda { render :new } },
|
40
41
|
update: { render: lambda { redirect_to edit_user_path(@user) } ,rescue: lambda { render :edit } },
|
41
|
-
|
42
|
+
destroy: { render: lambda { redirect_to root_path } ,rescue: lambda { render :edit } }
|
43
|
+
|
44
|
+
...
|
45
|
+
|
46
|
+
private
|
47
|
+
def create_params
|
48
|
+
params.require(:user).permit(
|
49
|
+
:name, :email, :password
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
def update_params
|
54
|
+
params.require(:user).permit(
|
55
|
+
:email, :password
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Destroyed condition variable object
|
60
|
+
def destroy_params
|
61
|
+
{ id: params[:id] }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
```
|
65
|
+
|
66
|
+
### Customized Actions
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
class UsersController < ApplicationController
|
70
|
+
rescue_controller User, :new, :edit, :show
|
71
|
+
|
72
|
+
def create
|
73
|
+
rescue_respond(:customized_create_call, create_params,
|
74
|
+
render: lambda { redirect_to edit_user_path(@user) },
|
75
|
+
rescue: lambda { render :new } }
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def create_params
|
81
|
+
params.require(:user).permit(
|
82
|
+
:name, :email, :password
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
def customized_create_call params
|
87
|
+
if User.exists?(params)
|
88
|
+
raise UserDuplicationError, "your email is duplicated!"
|
89
|
+
else
|
90
|
+
@user = User.new(params)
|
91
|
+
@user.save!
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
42
96
|
```
|
43
97
|
|
44
98
|
## Render Errors
|
data/lib/rescue/controller.rb
CHANGED
@@ -31,7 +31,7 @@ module Rescue
|
|
31
31
|
names.each do |name|
|
32
32
|
options = args[name]||{}
|
33
33
|
type = options[:type]||name
|
34
|
-
raise RuntimeError "
|
34
|
+
raise RuntimeError, "`#{name}` is already defined." if object.method_defined?(name)
|
35
35
|
case type
|
36
36
|
when :show, :edit
|
37
37
|
object.send(:define_method, name) do
|
@@ -46,11 +46,15 @@ module Rescue
|
|
46
46
|
end
|
47
47
|
when :create, :update, :destroy
|
48
48
|
object.send(:define_method, name) do
|
49
|
-
|
50
|
-
|
49
|
+
begin
|
50
|
+
params = send(options[:params]||:"#{name}_params")
|
51
|
+
rescue_respond(:"#{type}_call", params, options)
|
52
|
+
rescue NoMethodError => e
|
53
|
+
raise NoParameterMethodError.new(self.class, e.name)
|
54
|
+
end
|
51
55
|
end
|
52
56
|
else
|
53
|
-
raise
|
57
|
+
raise Rescue::NoActionError.new(type)
|
54
58
|
end
|
55
59
|
end
|
56
60
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Rescue
|
2
|
+
|
3
|
+
|
4
|
+
class NoActionError < ArgumentError
|
5
|
+
def initialize type
|
6
|
+
super "Undefined `#{type}` type. Please specify :show, :edit, :new, :create, :update, or :destory on the :type argument."
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class NoParameterMethodError < NoMethodError
|
11
|
+
def initialize clazz, name
|
12
|
+
super "Undefined method `#{name}` for #{clazz.name}. Please define private method `#{name}` to return the permissible parameters."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/lib/rescue/version.rb
CHANGED
data/lib/rescue-dog.rb
CHANGED
data/rescue-dog.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.version = Rescue::VERSION
|
9
9
|
gem.authors = ["yulii"]
|
10
10
|
gem.email = ["yuliinfo@gmail.com"]
|
11
|
-
gem.description = %q{
|
12
|
-
gem.summary = %q{
|
11
|
+
gem.description = %q{Responds status and error handling for Rails}
|
12
|
+
gem.summary = %q{Declare simple CRUD and respond error methods}
|
13
13
|
gem.homepage = "https://github.com/yulii/rescue-dog"
|
14
14
|
gem.license = 'MIT'
|
15
15
|
|
@@ -3,19 +3,19 @@ require 'spec_helper'
|
|
3
3
|
|
4
4
|
describe Rescue::Controller do
|
5
5
|
|
6
|
-
let(:
|
6
|
+
let(:controller) do
|
7
7
|
Class.new ApplicationController do
|
8
8
|
include Rescue::Controller
|
9
9
|
rescue_controller RescueModel,
|
10
10
|
show: [:show_action],
|
11
11
|
edit: [:edit_action],
|
12
12
|
new: [:new_action],
|
13
|
-
create: { render: lambda { } ,rescue: lambda { } },
|
14
|
-
update: { render: lambda { } ,rescue: lambda { } },
|
15
|
-
destroy: { render: lambda { } ,rescue: lambda { } },
|
16
|
-
create_action: { type: :create ,render: lambda { } ,rescue: lambda { } },
|
17
|
-
update_action: { type: :update ,render: lambda { } ,rescue: lambda { } },
|
18
|
-
destroy_action: { type: :destroy ,render: lambda { } ,rescue: lambda { } }
|
13
|
+
create: { render: lambda { } ,rescue: lambda { raise $! } },
|
14
|
+
update: { render: lambda { } ,rescue: lambda { raise $! } },
|
15
|
+
destroy: { render: lambda { } ,rescue: lambda { raise $! } },
|
16
|
+
create_action: { type: :create ,render: lambda { } ,rescue: lambda { raise $! } ,params: :customized_params },
|
17
|
+
update_action: { type: :update ,render: lambda { } ,rescue: lambda { raise $! } ,params: :customized_params },
|
18
|
+
destroy_action: { type: :destroy ,render: lambda { } ,rescue: lambda { raise $! } ,params: :customized_params }
|
19
19
|
|
20
20
|
def customized_create_action
|
21
21
|
rescue_respond(:create_call, create_params,
|
@@ -26,7 +26,7 @@ describe Rescue::Controller do
|
|
26
26
|
|
27
27
|
def customized_update_action
|
28
28
|
rescue_respond(:update_call, update_params,
|
29
|
-
render: lambda {
|
29
|
+
render: lambda { },
|
30
30
|
rescue: lambda { }
|
31
31
|
)
|
32
32
|
end
|
@@ -37,76 +37,129 @@ describe Rescue::Controller do
|
|
37
37
|
rescue: lambda { }
|
38
38
|
)
|
39
39
|
end
|
40
|
+
|
41
|
+
def execute
|
42
|
+
rescue_respond(:execute_call, execute_params,
|
43
|
+
render: lambda { },
|
44
|
+
rescue: lambda { }
|
45
|
+
)
|
46
|
+
end
|
40
47
|
end
|
41
48
|
end
|
42
49
|
|
43
|
-
|
44
|
-
|
50
|
+
# Stub: flash object
|
51
|
+
let(:flash) do
|
52
|
+
flash = Hash.new
|
53
|
+
flash.stub(:now).and_return({})
|
54
|
+
flash
|
45
55
|
end
|
46
56
|
|
47
57
|
[:rescue_associate, :rescue_controller].each do |name|
|
48
|
-
it "should
|
49
|
-
expect(
|
58
|
+
it "should declare `#{name}` method" do
|
59
|
+
expect(controller.public_methods.include? name).to be_true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
[ :rescue_respond,
|
64
|
+
:find_call, :new_call, :create_call, :update_call, :destroy_call].each do |name|
|
65
|
+
it "should declare `#{name}` method as private" do
|
66
|
+
expect(controller.private_instance_methods.include? name).to be_true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
[ :new, :edit, :show, :create, :update, :destroy,
|
71
|
+
:show_action, :edit_action, :new_action,
|
72
|
+
:create_action, :update_action, :destroy_action ].each do |name|
|
73
|
+
it "should declare `#{name}` method as public" do
|
74
|
+
expect(controller.public_instance_methods.include? name).to be_true
|
50
75
|
end
|
51
76
|
end
|
52
77
|
|
78
|
+
context "when action is executed" do
|
79
|
+
let(:object) do
|
80
|
+
object = controller.new
|
81
|
+
# Stub: flash message
|
82
|
+
object.stub(:flash).and_return(flash)
|
83
|
+
# Stub: controller/action name for flash messages
|
84
|
+
object.stub(:controller_path).and_return('')
|
85
|
+
object.stub(:controller_name).and_return('')
|
86
|
+
object.stub(:action_name).and_return('')
|
87
|
+
|
88
|
+
# Stub: parameter methods
|
89
|
+
object.stub(:create_params).and_return({})
|
90
|
+
object.stub(:update_params).and_return({})
|
91
|
+
object.stub(:destroy_params).and_return({})
|
92
|
+
object.stub(:execute_params).and_return({})
|
93
|
+
object.stub(:customized_params).and_return({})
|
94
|
+
|
95
|
+
# Stub: call methods
|
96
|
+
object.stub(:find_call).with(any_args()).and_raise('find_call execute')
|
97
|
+
object.stub(:new_call).and_raise('new_call execute')
|
98
|
+
object.stub(:create_call).and_raise('create_call execute')
|
99
|
+
object.stub(:update_call).and_raise('update_call execute')
|
100
|
+
object.stub(:destroy_call).and_raise('destroy_call execute')
|
101
|
+
object.stub(:execute_call).and_raise()
|
102
|
+
object
|
103
|
+
end
|
104
|
+
|
105
|
+
# Action Type Relation
|
106
|
+
{ find: [:show, :edit, :show_action, :edit_action],
|
107
|
+
new: [:new, :new_action],
|
108
|
+
create: [:create, :create_action],
|
109
|
+
update: [:update, :update_action],
|
110
|
+
destroy: [:destroy, :destroy_action]
|
111
|
+
}.each do |type, names|
|
112
|
+
names.each do |name|
|
113
|
+
it "should run `#{type}_call` when `#{name}` is executed" do
|
114
|
+
expect { object.send(name) }.to raise_error(RuntimeError, "#{type}_call execute")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
#it "should be performed within 500 microseconds" do
|
120
|
+
# n = 10000
|
121
|
+
# measure = Benchmark.measure do
|
122
|
+
# n.times { object.execute }
|
123
|
+
# end
|
124
|
+
# expect(measure.total).to be < (500 * 1.0e-06 * n)
|
125
|
+
#end
|
126
|
+
end
|
53
127
|
|
54
128
|
describe "#rescue_respond" do
|
55
129
|
let(:object) do
|
56
130
|
clazz = Class.new ApplicationController do
|
57
131
|
include Rescue::Controller
|
132
|
+
|
133
|
+
# Subjects
|
134
|
+
def render_execute
|
135
|
+
rescue_respond(:stub_call, {},
|
136
|
+
render: lambda { 'render' },
|
137
|
+
rescue: lambda { 'rescue' }
|
138
|
+
)
|
139
|
+
end
|
140
|
+
|
141
|
+
def rescue_execute
|
142
|
+
rescue_respond(:stub_call, {},
|
143
|
+
render: lambda { raise RuntimeError },
|
144
|
+
rescue: lambda { 'rescue' }
|
145
|
+
)
|
146
|
+
end
|
58
147
|
end
|
148
|
+
|
59
149
|
object = clazz.new
|
60
|
-
object.stub(:flash).and_return(
|
150
|
+
object.stub(:flash).and_return(flash)
|
61
151
|
object.stub(:controller_path).and_return('rescue')
|
62
152
|
object.stub(:action_name).and_return('action')
|
63
153
|
object.stub(:stub_call).with({}).and_return(nil)
|
64
154
|
object
|
65
155
|
end
|
66
156
|
|
67
|
-
it "should
|
68
|
-
expect(
|
69
|
-
object.send(:rescue_respond, :stub_call, {},
|
70
|
-
render: lambda { return 'render' },
|
71
|
-
rescue: lambda { return 'rescue' })
|
72
|
-
).to eq('render')
|
157
|
+
it "should render with no error" do
|
158
|
+
expect(object.render_execute).to eq('render')
|
73
159
|
end
|
74
160
|
|
75
|
-
|
76
|
-
|
77
|
-
describe Rescue::Controller::ClassMethods do
|
78
|
-
describe "#rescue_controller" do
|
79
|
-
|
80
|
-
let(:object) do
|
81
|
-
Class.new ApplicationController do
|
82
|
-
extend Rescue::Controller::ClassMethods
|
83
|
-
rescue_controller RescueModel,
|
84
|
-
show: [:show_action],
|
85
|
-
edit: [:edit_action],
|
86
|
-
new: [:new_action],
|
87
|
-
create: { render: lambda { } ,rescue: lambda { } },
|
88
|
-
update: { render: lambda { } ,rescue: lambda { } },
|
89
|
-
destroy: { render: lambda { } ,rescue: lambda { } },
|
90
|
-
create_action: { type: :create ,render: lambda { } ,rescue: lambda { } },
|
91
|
-
update_action: { type: :update ,render: lambda { } ,rescue: lambda { } },
|
92
|
-
destroy_action: { type: :destroy ,render: lambda { } ,rescue: lambda { } }
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
[:find_call, :new_call, :create_call, :update_call, :destroy_call].each do |name|
|
97
|
-
it "should be defined private method `#{name}`" do
|
98
|
-
expect(object.private_instance_methods.include? name).to be_true
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
[ :new, :edit, :show, :create, :update, :destroy,
|
103
|
-
:show_action, :edit_action, :new_action,
|
104
|
-
:create_action, :update_action, :destroy_action ].each do |name|
|
105
|
-
it "should be defined public method `#{name}`" do
|
106
|
-
expect(object.public_instance_methods.include? name).to be_true
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
161
|
+
it "should render by the rescue block" do
|
162
|
+
expect(object.rescue_execute).to eq('rescue')
|
110
163
|
end
|
111
164
|
end
|
112
165
|
|
@@ -17,7 +17,7 @@ describe Rescue::Controller::Action do
|
|
17
17
|
clazz
|
18
18
|
end
|
19
19
|
|
20
|
-
describe "#
|
20
|
+
describe "#define_call" do
|
21
21
|
let(:controller) do # Fake Controller
|
22
22
|
clazz = model
|
23
23
|
Class.new do
|
@@ -27,7 +27,6 @@ describe Rescue::Controller::Action do
|
|
27
27
|
|
28
28
|
let(:object) do
|
29
29
|
object = controller.new
|
30
|
-
object.stub(:rescuemodel_params).and_return({})
|
31
30
|
object.stub(:params).and_return({})
|
32
31
|
object
|
33
32
|
end
|
@@ -35,15 +34,96 @@ describe Rescue::Controller::Action do
|
|
35
34
|
let(:params) { {} }
|
36
35
|
|
37
36
|
[:find_call, :new_call, :create_call, :update_call, :destroy_call].each do |name|
|
38
|
-
it "should
|
37
|
+
it "should declare `#{name}` method as private" do
|
39
38
|
expect(controller.private_instance_methods.include? name).to be_true
|
40
39
|
end
|
41
40
|
it "should not raise error" do
|
42
41
|
expect { object.send(name, params) }.not_to raise_error
|
43
42
|
end
|
44
43
|
end
|
45
|
-
|
46
44
|
end
|
47
45
|
|
46
|
+
describe "#define" do
|
47
|
+
let(:controller) do # Fake Controller
|
48
|
+
clazz = model
|
49
|
+
Class.new do
|
50
|
+
Rescue::Controller::Action.define_call self, clazz, :@rescue
|
51
|
+
Rescue::Controller::Action.define self,
|
52
|
+
[:show, :edit, :new, :create, :update, :destroy],
|
53
|
+
show: { render: lambda { 'show' } },
|
54
|
+
edit: { render: lambda { 'edit' } },
|
55
|
+
new: { render: lambda { 'new' } },
|
56
|
+
create: { render: lambda { 'create' } },
|
57
|
+
update: { render: lambda { 'update' } },
|
58
|
+
destroy: { render: lambda { 'destroy' } }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:object) do
|
63
|
+
object = controller.new
|
64
|
+
object.stub(:params).and_return({})
|
65
|
+
object.stub(:create_params).and_return({})
|
66
|
+
object.stub(:update_params).and_return({})
|
67
|
+
object.stub(:destroy_params).and_return({})
|
68
|
+
|
69
|
+
# Stub: rescue_respond
|
70
|
+
object.stub(:rescue_respond) do |call, params, options|
|
71
|
+
options[:render].call
|
72
|
+
end
|
73
|
+
object
|
74
|
+
end
|
75
|
+
|
76
|
+
[:show, :edit, :new, :create, :update, :destroy].each do |name|
|
77
|
+
it "should declare `#{name}` method" do
|
78
|
+
expect(controller.public_instance_methods.include? name).to be_true
|
79
|
+
end
|
80
|
+
it "should render" do
|
81
|
+
expect(object.send(name)).to eq(name.to_s)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "when unknown types are specified" do
|
86
|
+
it do
|
87
|
+
expect {
|
88
|
+
Class.new do
|
89
|
+
Rescue::Controller::Action.define self, [:action],
|
90
|
+
action: { type: :undefined ,render: lambda { 'render' } ,rescue: lambda { 'rescue' } }
|
91
|
+
end
|
92
|
+
}.to raise_error(Rescue::NoActionError, Rescue::NoActionError.new(:undefined).message)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "when an action name is duplicated" do
|
97
|
+
it "should not raise error for the first time" do
|
98
|
+
expect {
|
99
|
+
Class.new do
|
100
|
+
Rescue::Controller::Action.define self, [:action],
|
101
|
+
action: { type: :show ,render: lambda { 'render' } ,rescue: lambda { 'rescue' } }
|
102
|
+
end
|
103
|
+
}.not_to raise_error
|
104
|
+
end
|
105
|
+
it "should raise RuntimeError with \"`action` is already defined.\"" do
|
106
|
+
expect {
|
107
|
+
Class.new do
|
108
|
+
def action ; end
|
109
|
+
Rescue::Controller::Action.define self, [:action],
|
110
|
+
action: { type: :show ,render: lambda { 'render' } ,rescue: lambda { 'rescue' } }
|
111
|
+
end
|
112
|
+
}.to raise_error(RuntimeError, "`action` is already defined.")
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context "when an parameter method is undefined" do
|
117
|
+
{ create: :create_params,
|
118
|
+
update: :update_params,
|
119
|
+
destroy: :destroy_params }.each do |name, params|
|
120
|
+
it do
|
121
|
+
expect {
|
122
|
+
controller.new.send(name)
|
123
|
+
}.to raise_error(Rescue::NoParameterMethodError, Rescue::NoParameterMethodError.new(controller, params).message)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
48
128
|
end
|
49
129
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rescue-dog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yulii
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 4.0.0
|
27
|
-
description:
|
27
|
+
description: Responds status and error handling for Rails
|
28
28
|
email:
|
29
29
|
- yuliinfo@gmail.com
|
30
30
|
executables: []
|
@@ -52,6 +52,7 @@ files:
|
|
52
52
|
- lib/rescue/controllers/dynamic.rb
|
53
53
|
- lib/rescue/controllers/flash.rb
|
54
54
|
- lib/rescue/controllers/static.rb
|
55
|
+
- lib/rescue/errors.rb
|
55
56
|
- lib/rescue/exceptions/application_error.rb
|
56
57
|
- lib/rescue/exceptions/respond_error.rb
|
57
58
|
- lib/rescue/version.rb
|
@@ -97,7 +98,7 @@ rubyforge_project:
|
|
97
98
|
rubygems_version: 2.0.7
|
98
99
|
signing_key:
|
99
100
|
specification_version: 4
|
100
|
-
summary:
|
101
|
+
summary: Declare simple CRUD and respond error methods
|
101
102
|
test_files:
|
102
103
|
- spec/fake_rails.rb
|
103
104
|
- spec/rescue/controller_spec.rb
|