focused_controller 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -6
- data/Appraisals +1 -0
- data/LICENSE +20 -0
- data/README.md +273 -0
- data/focused_controller.gemspec +9 -9
- data/gemfiles/rails-3-0.gemfile +1 -0
- data/lib/focused_controller/action_name.rb +1 -1
- data/lib/focused_controller/mixin.rb +23 -1
- data/lib/focused_controller/route_mapper.rb +14 -6
- data/lib/focused_controller/test_helper.rb +1 -8
- data/lib/focused_controller/version.rb +1 -1
- data/test/app/app/controllers/posts_controller.rb +21 -29
- data/test/app/spec/isolated_spec_helper.rb +2 -5
- data/test/app/spec/unit/controllers/posts_controller_isolated_spec.rb +15 -7
- data/test/app/spec/unit/controllers/posts_controller_spec.rb +12 -7
- data/test/app/test/functional/posts_controller_test.rb +1 -1
- data/test/app/test/isolated_test_helper.rb +2 -5
- data/test/app/test/unit/controllers/posts_controller_isolated_test.rb +18 -9
- data/test/app/test/unit/controllers/posts_controller_test.rb +15 -8
- data/test/unit/functional_test_helper_test.rb +6 -6
- data/test/unit/mixin_test.rb +74 -6
- data/test/unit/route_mapper_test.rb +4 -2
- data/test/unit/test_helper_test.rb +12 -36
- metadata +69 -29
data/.travis.yml
CHANGED
@@ -3,13 +3,9 @@ rvm:
|
|
3
3
|
- 1.9.3
|
4
4
|
- 1.9.2
|
5
5
|
- 1.8.7
|
6
|
-
-
|
7
|
-
|
8
|
-
# Add JRuby support when poltergeist handles JRuby
|
6
|
+
- jruby-18mode
|
7
|
+
- jruby-19mode
|
9
8
|
gemfile:
|
10
9
|
- gemfiles/rails-3-2.gemfile
|
11
10
|
- gemfiles/rails-3-1.gemfile
|
12
11
|
- gemfiles/rails-3-0.gemfile
|
13
|
-
before_script:
|
14
|
-
- "export DISPLAY=:99.0"
|
15
|
-
- "sh -e /etc/init.d/xvfb start"
|
data/Appraisals
CHANGED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Jonathan Leighton
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -1 +1,274 @@
|
|
1
|
+
# Focused Controller #
|
2
|
+
|
1
3
|
[![Build Status](https://secure.travis-ci.org/jonleighton/focused_controller.png?branch=master)](http://travis-ci.org/jonleighton/focused_controller)
|
4
|
+
|
5
|
+
Focused Controller alters Rails' conventions so that each individual action in
|
6
|
+
a controller is represented by its own class. This makes it easier to break up
|
7
|
+
the code within an action and share code between different actions.
|
8
|
+
|
9
|
+
Focused Controller also provides test helpers which enable you to write unit
|
10
|
+
tests for your controller code. This is much faster than functional testing,
|
11
|
+
and better suited to testing fine grained logic that may exist in your actions.
|
12
|
+
|
13
|
+
There is a [mailing list](http://groups.google.com/group/focused_controller)
|
14
|
+
for discussion.
|
15
|
+
|
16
|
+
## Synopsis ##
|
17
|
+
|
18
|
+
``` ruby
|
19
|
+
class ApplicationController
|
20
|
+
include FocusedController::Mixin
|
21
|
+
end
|
22
|
+
|
23
|
+
module PostsController
|
24
|
+
class Index < ApplicationController
|
25
|
+
expose(:posts) { Post.recent.limit(5) }
|
26
|
+
end
|
27
|
+
|
28
|
+
class New < ApplicationController
|
29
|
+
expose(:post) { Post.new }
|
30
|
+
end
|
31
|
+
|
32
|
+
class Singular < ApplicationController
|
33
|
+
expose(:post) { Post.find params[:id] }
|
34
|
+
before_filter { redirect_to root_path unless post.accessible_to?(current_user) }
|
35
|
+
end
|
36
|
+
|
37
|
+
class Show < Singular
|
38
|
+
end
|
39
|
+
|
40
|
+
class Update < Singular
|
41
|
+
def call
|
42
|
+
if post.update_attributes(params[:post])
|
43
|
+
# ...
|
44
|
+
else
|
45
|
+
# ...
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
Some notes:
|
53
|
+
|
54
|
+
* You can include `FocusedController::Mixin` anywhere, so you don't have
|
55
|
+
to use Focused Controller in every single controller if you don't want
|
56
|
+
to
|
57
|
+
* `expose` makes the object returned by the block available in your view
|
58
|
+
template. It also memoizes the result so the block will only be
|
59
|
+
executed once.
|
60
|
+
* It is not necessary to specify `:only` or `:except` on the before
|
61
|
+
filter, since we declare the filter for exactly the actions we want it
|
62
|
+
to run on. Rails has many methods which accept action names to limit
|
63
|
+
what they get applied to - this is basically irrelevant with Focused
|
64
|
+
Controller due to the increased granularity that having a class for each
|
65
|
+
action gives us.
|
66
|
+
* The `#call` method is what gets invoked when the action runs, so put
|
67
|
+
the 'active ingredients' in here.
|
68
|
+
|
69
|
+
## Routing ##
|
70
|
+
|
71
|
+
Rails' normal routing assumes your actions are methods inside an object
|
72
|
+
whose name ends with 'controller'. For example:
|
73
|
+
|
74
|
+
``` ruby
|
75
|
+
get '/posts/new' => 'posts#new'
|
76
|
+
```
|
77
|
+
|
78
|
+
will route `GET /posts/new` to `PostsController#new`.
|
79
|
+
|
80
|
+
To get around this, we use the `focused_controller_routes` helper:
|
81
|
+
|
82
|
+
``` ruby
|
83
|
+
Loco2::Application.routes.draw do
|
84
|
+
focused_controller_routes do
|
85
|
+
get '/posts/new' => 'posts#new'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
```
|
89
|
+
|
90
|
+
The route will now map to `PostsController::New#call`.
|
91
|
+
|
92
|
+
All the normal routing macros are also supported:
|
93
|
+
|
94
|
+
``` ruby
|
95
|
+
focused_controller_routes do
|
96
|
+
resources :posts
|
97
|
+
end
|
98
|
+
```
|
99
|
+
|
100
|
+
## Functional Testing ##
|
101
|
+
|
102
|
+
If you wish, focused controllers can be tested in the classical
|
103
|
+
'functional' style. It no longer makes sense to specify the method name
|
104
|
+
to be called as it would always be `#call`. So this is omitted:
|
105
|
+
|
106
|
+
``` ruby
|
107
|
+
require 'focused_controller/functional_test_helper'
|
108
|
+
|
109
|
+
module UsersController
|
110
|
+
class CreateTest < ActionController::TestCase
|
111
|
+
include FocusedController::FunctionalTestHelper
|
112
|
+
|
113
|
+
test "should create user" do
|
114
|
+
assert_difference('User.count') do
|
115
|
+
post user: { name: 'Jon' }
|
116
|
+
end
|
117
|
+
|
118
|
+
assert_redirected_to user_path(@controller.user)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
```
|
123
|
+
|
124
|
+
There is also an equivalent helper for RSpec:
|
125
|
+
|
126
|
+
``` ruby
|
127
|
+
require 'focused_controller/rspec_functional_helper'
|
128
|
+
|
129
|
+
describe UsersController do
|
130
|
+
include FocusedController::RSpecFunctionalHelper
|
131
|
+
|
132
|
+
describe UsersController::Create do
|
133
|
+
it "should create user" do
|
134
|
+
expect { post user: { name: 'Jon' } }.to change(User, :count).by(1)
|
135
|
+
response.should redirect_to(user_path(subject.user))
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
```
|
140
|
+
|
141
|
+
## Unit Testing ##
|
142
|
+
|
143
|
+
Unit testing is faster and better suited to testing logic than
|
144
|
+
functional testing. To do so, you instantiate your action class and call
|
145
|
+
methods on it:
|
146
|
+
|
147
|
+
``` ruby
|
148
|
+
module UsersController
|
149
|
+
class ShowTest < ActiveSupport::TestCase
|
150
|
+
test 'finds the user' do
|
151
|
+
user = User.create
|
152
|
+
|
153
|
+
controller = UsersController::Show.new
|
154
|
+
controller.params = { id: user.id }
|
155
|
+
|
156
|
+
assert_equal user, controller.user
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
```
|
161
|
+
|
162
|
+
### The `#call` method ###
|
163
|
+
|
164
|
+
Testing the code in your `#call` method is a little more involved,
|
165
|
+
depending on what's in it. For example, your `#call` method may use
|
166
|
+
(explicitly or implicitly) any of the following objects:
|
167
|
+
|
168
|
+
* request
|
169
|
+
* response
|
170
|
+
* params
|
171
|
+
* session
|
172
|
+
* flash
|
173
|
+
* cookies
|
174
|
+
|
175
|
+
To make the experience smoother, Focused Controller sets up mock
|
176
|
+
versions of these objects, much like with classical functional testing.
|
177
|
+
It also provides accessors for these objects in your test class.
|
178
|
+
|
179
|
+
``` ruby
|
180
|
+
require 'focused_controller/test_helper'
|
181
|
+
|
182
|
+
module UsersController
|
183
|
+
class CreateTest < ActiveSupport::TestCase
|
184
|
+
include FocusedController::TestHelper
|
185
|
+
|
186
|
+
test "should create user" do
|
187
|
+
controller.params = { user: { name: 'Jon' } }
|
188
|
+
|
189
|
+
assert_difference('User.count') do
|
190
|
+
controller.call
|
191
|
+
end
|
192
|
+
|
193
|
+
assert_redirected_to user_path(controller.user)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
```
|
198
|
+
|
199
|
+
### Assertions ###
|
200
|
+
|
201
|
+
You have access to the normal assertions found in Rails' functional tests:
|
202
|
+
|
203
|
+
* `assert_template`
|
204
|
+
* `assert_response`
|
205
|
+
* `assert_redirected_to`
|
206
|
+
|
207
|
+
### Filters ###
|
208
|
+
|
209
|
+
In unit tests, we're not testing through the Rack stack. We're just calling the
|
210
|
+
`#call` method. Therefore, filters do not get run. If some filter code is
|
211
|
+
crucial to what your action is doing then you should move it out of the filter.
|
212
|
+
If the filter code is separate, then you might want to unit-test it separately,
|
213
|
+
or you might decide that covering it in integration/acceptance tests is
|
214
|
+
sufficient.
|
215
|
+
|
216
|
+
### RSpec ###
|
217
|
+
|
218
|
+
There is a helper for RSpec as well:
|
219
|
+
|
220
|
+
``` ruby
|
221
|
+
require 'focused_controller/rspec_helper'
|
222
|
+
|
223
|
+
describe UsersController do
|
224
|
+
include FocusedController::RSpecHelper
|
225
|
+
|
226
|
+
describe UsersController::Create do
|
227
|
+
test "should create user" do
|
228
|
+
subject.params = { user: { name: 'Jon' } }
|
229
|
+
expect { subject.call }.to change(User, :count).by(1)
|
230
|
+
response.should redirect_to(user_path(subject.user))
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
```
|
235
|
+
|
236
|
+
## Isolated unit tests ##
|
237
|
+
|
238
|
+
It is possible to completely decouple your focused controller tests from the
|
239
|
+
Rails application. This means you don't have to pay the penalty of starting up
|
240
|
+
Rails every time you want to run a test. This is an advanced feature and your
|
241
|
+
mileage may vary. The benefit this brings will depend on how coupled your
|
242
|
+
controllers/tests are to other dependencies.
|
243
|
+
|
244
|
+
Your `config/routes.rb` file is a dependency. When you use a URL helper
|
245
|
+
you are depending on that file. As this is a common dependency, Focused
|
246
|
+
Controller provides a way to stub out URL helpers:
|
247
|
+
|
248
|
+
``` ruby
|
249
|
+
module UsersController
|
250
|
+
class CreateTest < ActiveSupport::TestCase
|
251
|
+
include FocusedController::TestHelper
|
252
|
+
stub_url :user
|
253
|
+
|
254
|
+
# ...
|
255
|
+
end
|
256
|
+
end
|
257
|
+
```
|
258
|
+
|
259
|
+
The `stub_url` declaration will make the `user_path` and `user_url`
|
260
|
+
methods in your test and your controller return stub objects. These can
|
261
|
+
be compared, so `user_path(user1) == user_path(user1)`, but
|
262
|
+
`user_path(user1) != user_path(user2)`.
|
263
|
+
|
264
|
+
## More examples ##
|
265
|
+
|
266
|
+
The [acceptance
|
267
|
+
tests](https://github.com/jonleighton/focused_controller/tree/master/test/acceptance)
|
268
|
+
for Focused Controller exercise a [complete Rails
|
269
|
+
application](https://github.com/jonleighton/focused_controller/tree/master/test/app),
|
270
|
+
which uses the plugin. Therefore, you might wish to look there to get
|
271
|
+
more of an idea about how it can be used.
|
272
|
+
|
273
|
+
(Note that the code there is based on Rails' scaffolding, not how I
|
274
|
+
would typically write controllers and tests.)
|
data/focused_controller.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.authors = ["Jon Leighton"]
|
9
9
|
s.email = ["j@jonathanleighton.com"]
|
10
10
|
s.homepage = "http://github.com/jonleighton/focused_controller"
|
11
|
-
s.summary = %q{Write Rails controllers
|
12
|
-
s.description = %q{Write Rails controllers
|
11
|
+
s.summary = %q{Write Rails controllers with one class per action}
|
12
|
+
s.description = %q{Write Rails controllers with one class per action}
|
13
13
|
|
14
14
|
s.rubyforge_project = "focused_controller"
|
15
15
|
|
@@ -20,11 +20,11 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.add_dependency 'actionpack', '~> 3.0'
|
22
22
|
|
23
|
-
s.add_development_dependency 'minitest',
|
24
|
-
s.add_development_dependency 'capybara',
|
25
|
-
s.add_development_dependency 'capybara_minitest_spec', '~> 0.2
|
26
|
-
s.add_development_dependency 'poltergeist',
|
27
|
-
s.add_development_dependency 'rspec',
|
28
|
-
s.add_development_dependency 'rspec-rails',
|
29
|
-
s.add_development_dependency 'appraisal',
|
23
|
+
s.add_development_dependency 'minitest', '~> 2.11'
|
24
|
+
s.add_development_dependency 'capybara', '~> 1.1'
|
25
|
+
s.add_development_dependency 'capybara_minitest_spec', '~> 0.2'
|
26
|
+
s.add_development_dependency 'poltergeist', '~> 0.7'
|
27
|
+
s.add_development_dependency 'rspec', '~> 2.8'
|
28
|
+
s.add_development_dependency 'rspec-rails', '~> 2.8'
|
29
|
+
s.add_development_dependency 'appraisal', '~> 0.4'
|
30
30
|
end
|
data/gemfiles/rails-3-0.gemfile
CHANGED
@@ -20,6 +20,28 @@ module FocusedController
|
|
20
20
|
def call(env)
|
21
21
|
action(FocusedController.action_name).call(env)
|
22
22
|
end
|
23
|
+
|
24
|
+
def expose(name, &block)
|
25
|
+
if block_given?
|
26
|
+
define_method(name) do |*args|
|
27
|
+
ivar = "@#{name}"
|
28
|
+
|
29
|
+
if instance_variable_defined?(ivar)
|
30
|
+
instance_variable_get(ivar)
|
31
|
+
else
|
32
|
+
instance_variable_set(ivar, instance_exec(block, *args, &block))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
else
|
36
|
+
attr_reader name
|
37
|
+
end
|
38
|
+
|
39
|
+
helper_method name
|
40
|
+
end
|
41
|
+
|
42
|
+
def controller_name
|
43
|
+
name.split('::')[-2].sub(/Controller$/, '').underscore
|
44
|
+
end
|
23
45
|
end
|
24
46
|
|
25
47
|
def action_name
|
@@ -38,7 +60,7 @@ module FocusedController
|
|
38
60
|
end
|
39
61
|
end
|
40
62
|
|
41
|
-
def
|
63
|
+
def call
|
42
64
|
end
|
43
65
|
end
|
44
66
|
end
|
@@ -24,15 +24,23 @@ module FocusedController
|
|
24
24
|
|
25
25
|
def to_option
|
26
26
|
if @options[:to] && !@options[:to].respond_to?(:call)
|
27
|
-
@options[:to]
|
27
|
+
if @options[:to].include?('#')
|
28
|
+
stringify_controller_and_action(*@options[:to].split('#'))
|
29
|
+
else
|
30
|
+
@options[:to]
|
31
|
+
end
|
28
32
|
elsif @options[:action] && @scope[:controller]
|
29
|
-
|
30
|
-
name << @scope[:module].camelize << '::' if @scope[:module]
|
31
|
-
name << @scope[:controller].camelize << 'Controller::'
|
32
|
-
name << @options[:action].to_s.camelize
|
33
|
-
name
|
33
|
+
stringify_controller_and_action(@scope[:controller], @options[:action])
|
34
34
|
end
|
35
35
|
end
|
36
|
+
|
37
|
+
def stringify_controller_and_action(controller, action)
|
38
|
+
name = ''
|
39
|
+
name << @scope[:module].camelize << '::' if @scope[:module]
|
40
|
+
name << controller.camelize << 'Controller::'
|
41
|
+
name << action.to_s.camelize
|
42
|
+
name
|
43
|
+
end
|
36
44
|
end
|
37
45
|
|
38
46
|
class ActionDispatch::Routing::Mapper
|
@@ -110,13 +110,6 @@ module FocusedController
|
|
110
110
|
@response ||= TestResponse.new
|
111
111
|
end
|
112
112
|
|
113
|
-
def req(params = nil, session = nil, flash = nil)
|
114
|
-
controller.params = params if params
|
115
|
-
controller.session.update session if session
|
116
|
-
controller.flash.update flash if flash
|
117
|
-
controller.run
|
118
|
-
end
|
119
|
-
|
120
113
|
def session
|
121
114
|
controller.session
|
122
115
|
end
|
@@ -147,7 +140,7 @@ module FocusedController
|
|
147
140
|
controller.url_for(*args)
|
148
141
|
end
|
149
142
|
|
150
|
-
def respond_to?(
|
143
|
+
def respond_to?(*args)
|
151
144
|
unless defined?(@_routes_included) && @_routes_included
|
152
145
|
self.class.include_routes
|
153
146
|
@_routes_included = true
|
@@ -1,38 +1,20 @@
|
|
1
|
-
|
1
|
+
module PostsController
|
2
2
|
class Action < ApplicationController
|
3
3
|
end
|
4
4
|
|
5
5
|
class Index < Action
|
6
|
-
|
7
|
-
@posts ||= Post.all
|
8
|
-
end
|
9
|
-
helper_method :posts
|
10
|
-
end
|
11
|
-
|
12
|
-
class Singular < Action
|
13
|
-
def post
|
14
|
-
@post ||= begin
|
15
|
-
if params[:id]
|
16
|
-
Post.find(params[:id])
|
17
|
-
else
|
18
|
-
Post.new(params[:post])
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
helper_method :post
|
23
|
-
end
|
24
|
-
|
25
|
-
class Show < Singular
|
6
|
+
expose(:posts) { Post.all }
|
26
7
|
end
|
27
8
|
|
28
|
-
class
|
9
|
+
class Initializer < Action
|
10
|
+
expose(:post) { Post.new params[:post] }
|
29
11
|
end
|
30
12
|
|
31
|
-
class
|
13
|
+
class New < Initializer
|
32
14
|
end
|
33
15
|
|
34
|
-
class Create <
|
35
|
-
def
|
16
|
+
class Create < Initializer
|
17
|
+
def call
|
36
18
|
if post.save
|
37
19
|
redirect_to post, :notice => 'Post was successfully created.'
|
38
20
|
else
|
@@ -41,8 +23,18 @@ class PostsController
|
|
41
23
|
end
|
42
24
|
end
|
43
25
|
|
44
|
-
class
|
45
|
-
|
26
|
+
class Finder < Action
|
27
|
+
expose(:post) { Post.find params[:id] }
|
28
|
+
end
|
29
|
+
|
30
|
+
class Show < Finder
|
31
|
+
end
|
32
|
+
|
33
|
+
class Edit < Finder
|
34
|
+
end
|
35
|
+
|
36
|
+
class Update < Finder
|
37
|
+
def call
|
46
38
|
if post.update_attributes(params[:post])
|
47
39
|
redirect_to post, :notice => 'Post was successfully updated.'
|
48
40
|
else
|
@@ -51,8 +43,8 @@ class PostsController
|
|
51
43
|
end
|
52
44
|
end
|
53
45
|
|
54
|
-
class Destroy <
|
55
|
-
def
|
46
|
+
class Destroy < Finder
|
47
|
+
def call
|
56
48
|
post.destroy
|
57
49
|
redirect_to posts_url
|
58
50
|
end
|
@@ -1,9 +1,6 @@
|
|
1
1
|
require 'bundler/setup'
|
2
2
|
require 'rspec'
|
3
3
|
require 'focused_controller/rspec_helper'
|
4
|
-
require 'focused_controller/rspec_functional_helper'
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
POSTS = []
|
5
|
+
APP_ROOT = File.expand_path('../../app', __FILE__)
|
6
|
+
POSTS = []
|
@@ -1,4 +1,7 @@
|
|
1
1
|
require 'isolated_spec_helper'
|
2
|
+
require APP_ROOT + '/controllers/application_controller'
|
3
|
+
require APP_ROOT + '/controllers/posts_controller'
|
4
|
+
require APP_ROOT + '/models/post'
|
2
5
|
|
3
6
|
describe PostsController do
|
4
7
|
include FocusedController::RSpecHelper
|
@@ -10,7 +13,7 @@ describe PostsController do
|
|
10
13
|
|
11
14
|
describe PostsController::Index do
|
12
15
|
it "should get index" do
|
13
|
-
|
16
|
+
subject.call
|
14
17
|
response.should be_success
|
15
18
|
subject.posts.should_not be(:nil)
|
16
19
|
end
|
@@ -18,42 +21,47 @@ describe PostsController do
|
|
18
21
|
|
19
22
|
describe PostsController::New do
|
20
23
|
it "should get new" do
|
21
|
-
|
24
|
+
subject.call
|
22
25
|
response.should be_success
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
26
29
|
describe PostsController::Create do
|
27
30
|
it "should create post" do
|
28
|
-
|
31
|
+
subject.params = { :post => @post.attributes }
|
32
|
+
expect { subject.call }.to change(Post, :count).by(1)
|
29
33
|
response.should redirect_to(post_url(subject.post))
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
33
37
|
describe PostsController::Show do
|
34
38
|
it "should show post" do
|
35
|
-
|
39
|
+
subject.params = { :id => @post.id }
|
40
|
+
subject.call
|
36
41
|
response.should be_success
|
37
42
|
end
|
38
43
|
end
|
39
44
|
|
40
45
|
describe PostsController::Edit do
|
41
46
|
it "should get edit" do
|
42
|
-
|
47
|
+
subject.params = { :id => @post.id }
|
48
|
+
subject.call
|
43
49
|
response.should be_success
|
44
50
|
end
|
45
51
|
end
|
46
52
|
|
47
53
|
describe PostsController::Update do
|
48
54
|
it "should update post" do
|
49
|
-
|
55
|
+
subject.params = { :id => @post.id }
|
56
|
+
subject.call
|
50
57
|
response.should redirect_to(post_url(subject.post))
|
51
58
|
end
|
52
59
|
end
|
53
60
|
|
54
61
|
describe PostsController::Destroy do
|
55
62
|
it "should destroy post" do
|
56
|
-
|
63
|
+
subject.params = { :id => @post.id }
|
64
|
+
expect { subject.call }.to change(Post, :count).by(-1)
|
57
65
|
response.should redirect_to(posts_url)
|
58
66
|
end
|
59
67
|
end
|
@@ -9,7 +9,7 @@ describe PostsController do
|
|
9
9
|
|
10
10
|
describe PostsController::Index do
|
11
11
|
it "should get index" do
|
12
|
-
|
12
|
+
subject.call
|
13
13
|
response.should be_success
|
14
14
|
subject.posts.should_not be(:nil)
|
15
15
|
end
|
@@ -17,42 +17,47 @@ describe PostsController do
|
|
17
17
|
|
18
18
|
describe PostsController::New do
|
19
19
|
it "should get new" do
|
20
|
-
|
20
|
+
subject.call
|
21
21
|
response.should be_success
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
describe PostsController::Create do
|
26
26
|
it "should create post" do
|
27
|
-
|
27
|
+
subject.params = { :post => @post.attributes }
|
28
|
+
expect { subject.call }.to change(Post, :count).by(1)
|
28
29
|
response.should redirect_to(post_path(subject.post))
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
33
|
describe PostsController::Show do
|
33
34
|
it "should show post" do
|
34
|
-
|
35
|
+
subject.params = { :id => @post.id }
|
36
|
+
subject.call
|
35
37
|
response.should be_success
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
39
41
|
describe PostsController::Edit do
|
40
42
|
it "should get edit" do
|
41
|
-
|
43
|
+
subject.params = { :id => @post.id }
|
44
|
+
subject.call
|
42
45
|
response.should be_success
|
43
46
|
end
|
44
47
|
end
|
45
48
|
|
46
49
|
describe PostsController::Update do
|
47
50
|
it "should update post" do
|
48
|
-
|
51
|
+
subject.params = { :id => @post.id }
|
52
|
+
subject.call
|
49
53
|
response.should redirect_to(post_path(subject.post))
|
50
54
|
end
|
51
55
|
end
|
52
56
|
|
53
57
|
describe PostsController::Destroy do
|
54
58
|
it "should destroy post" do
|
55
|
-
|
59
|
+
subject.params = { :id => @post.id }
|
60
|
+
expect { subject.call }.to change(Post, :count).by(-1)
|
56
61
|
response.should redirect_to(posts_path)
|
57
62
|
end
|
58
63
|
end
|
@@ -1,10 +1,7 @@
|
|
1
1
|
require 'bundler/setup'
|
2
2
|
require 'test/unit'
|
3
3
|
require 'active_support/test_case'
|
4
|
-
require 'focused_controller/functional_test_helper'
|
5
4
|
require 'focused_controller/test_helper'
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
POSTS = []
|
6
|
+
APP_ROOT = File.expand_path('../../app', __FILE__)
|
7
|
+
POSTS = []
|
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'isolated_test_helper'
|
2
|
-
|
2
|
+
require APP_ROOT + '/controllers/application_controller'
|
3
|
+
require APP_ROOT + '/controllers/posts_controller'
|
4
|
+
require APP_ROOT + '/models/post'
|
3
5
|
|
4
|
-
|
6
|
+
module PostsController
|
5
7
|
class TestCase < ActiveSupport::TestCase
|
6
8
|
include FocusedController::TestHelper
|
7
9
|
stub_url :post, :posts
|
@@ -13,7 +15,7 @@ class PostsController
|
|
13
15
|
|
14
16
|
class IndexTest < TestCase
|
15
17
|
test "should get index" do
|
16
|
-
|
18
|
+
controller.call
|
17
19
|
assert_response :success
|
18
20
|
assert_not_nil controller.posts
|
19
21
|
end
|
@@ -21,15 +23,17 @@ class PostsController
|
|
21
23
|
|
22
24
|
class NewTest < TestCase
|
23
25
|
test "should get new" do
|
24
|
-
|
26
|
+
controller.call
|
25
27
|
assert_response :success
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
29
31
|
class CreateTest < TestCase
|
30
32
|
test "should create post" do
|
33
|
+
controller.params = { :post => @post.attributes }
|
34
|
+
|
31
35
|
assert_difference('Post.count') do
|
32
|
-
|
36
|
+
controller.call
|
33
37
|
end
|
34
38
|
|
35
39
|
assert_redirected_to post_url(controller.post)
|
@@ -38,29 +42,34 @@ class PostsController
|
|
38
42
|
|
39
43
|
class ShowTest < TestCase
|
40
44
|
test "should show post" do
|
41
|
-
|
45
|
+
controller.params = { :id => @post.id }
|
46
|
+
controller.call
|
42
47
|
assert_response :success
|
43
48
|
end
|
44
49
|
end
|
45
50
|
|
46
51
|
class EditTest < TestCase
|
47
52
|
test "should get edit" do
|
48
|
-
|
53
|
+
controller.params = { :id => @post.id }
|
54
|
+
controller.call
|
49
55
|
assert_response :success
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
53
59
|
class UpdateTest < TestCase
|
54
60
|
test "should update post" do
|
55
|
-
|
61
|
+
controller.params = { :id => @post.id }
|
62
|
+
controller.call
|
56
63
|
assert_redirected_to post_url(controller.post)
|
57
64
|
end
|
58
65
|
end
|
59
66
|
|
60
67
|
class DestroyTest < TestCase
|
61
68
|
test "should destroy post" do
|
69
|
+
controller.params = { :id => @post.id }
|
70
|
+
|
62
71
|
assert_difference('Post.count', -1) do
|
63
|
-
|
72
|
+
controller.call
|
64
73
|
end
|
65
74
|
|
66
75
|
assert_redirected_to posts_url
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
|
3
|
+
module PostsController
|
4
4
|
class TestCase < ActiveSupport::TestCase
|
5
5
|
include FocusedController::TestHelper
|
6
6
|
|
@@ -11,7 +11,7 @@ class PostsController
|
|
11
11
|
|
12
12
|
class IndexTest < TestCase
|
13
13
|
test "should get index" do
|
14
|
-
|
14
|
+
controller.call
|
15
15
|
assert_response :success
|
16
16
|
assert_not_nil controller.posts
|
17
17
|
end
|
@@ -19,15 +19,17 @@ class PostsController
|
|
19
19
|
|
20
20
|
class NewTest < TestCase
|
21
21
|
test "should get new" do
|
22
|
-
|
22
|
+
controller.call
|
23
23
|
assert_response :success
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
class CreateTest < TestCase
|
28
28
|
test "should create post" do
|
29
|
+
controller.params = { :post => @post.attributes }
|
30
|
+
|
29
31
|
assert_difference('Post.count') do
|
30
|
-
|
32
|
+
controller.call
|
31
33
|
end
|
32
34
|
|
33
35
|
assert_redirected_to post_path(controller.post)
|
@@ -36,29 +38,34 @@ class PostsController
|
|
36
38
|
|
37
39
|
class ShowTest < TestCase
|
38
40
|
test "should show post" do
|
39
|
-
|
41
|
+
controller.params = { :id => @post.id }
|
42
|
+
controller.call
|
40
43
|
assert_response :success
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
44
47
|
class EditTest < TestCase
|
45
48
|
test "should get edit" do
|
46
|
-
|
49
|
+
controller.params = { :id => @post.id }
|
50
|
+
controller.call
|
47
51
|
assert_response :success
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
51
55
|
class UpdateTest < TestCase
|
52
56
|
test "should update post" do
|
53
|
-
|
57
|
+
controller.params = { :id => @post.id }
|
58
|
+
controller.call
|
54
59
|
assert_redirected_to post_path(controller.post)
|
55
60
|
end
|
56
61
|
end
|
57
62
|
|
58
63
|
class DestroyTest < TestCase
|
59
64
|
test "should destroy post" do
|
65
|
+
controller.params = { :id => @post.id }
|
66
|
+
|
60
67
|
assert_difference('Post.count', -1) do
|
61
|
-
|
68
|
+
controller.call
|
62
69
|
end
|
63
70
|
|
64
71
|
assert_redirected_to posts_path
|
@@ -4,7 +4,7 @@ require 'action_controller'
|
|
4
4
|
|
5
5
|
module FocusedController
|
6
6
|
module FunctionalTestHelper
|
7
|
-
|
7
|
+
module FakePostsController
|
8
8
|
class Action < ActionController::Base; end
|
9
9
|
class Index < Action; end
|
10
10
|
class Show < Action; end
|
@@ -46,19 +46,19 @@ module FocusedController
|
|
46
46
|
end
|
47
47
|
|
48
48
|
subject.get :foo, :bar, :baz
|
49
|
-
subject.last_process.must_equal ['
|
49
|
+
subject.last_process.must_equal ['call', :foo, :bar, :baz, 'GET']
|
50
50
|
|
51
51
|
subject.post :foo, :bar, :baz
|
52
|
-
subject.last_process.must_equal ['
|
52
|
+
subject.last_process.must_equal ['call', :foo, :bar, :baz, 'POST']
|
53
53
|
|
54
54
|
subject.put :foo, :bar, :baz
|
55
|
-
subject.last_process.must_equal ['
|
55
|
+
subject.last_process.must_equal ['call', :foo, :bar, :baz, 'PUT']
|
56
56
|
|
57
57
|
subject.delete :foo, :bar, :baz
|
58
|
-
subject.last_process.must_equal ['
|
58
|
+
subject.last_process.must_equal ['call', :foo, :bar, :baz, 'DELETE']
|
59
59
|
|
60
60
|
subject.head :foo, :bar, :baz
|
61
|
-
subject.last_process.must_equal ['
|
61
|
+
subject.last_process.must_equal ['call', :foo, :bar, :baz, 'HEAD']
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
data/test/unit/mixin_test.rb
CHANGED
@@ -34,9 +34,9 @@ module FocusedController
|
|
34
34
|
klass.controller_path.must_equal 'posts'
|
35
35
|
end
|
36
36
|
|
37
|
-
it "has a .call which dispatches the #
|
37
|
+
it "has a .call which dispatches the #call action" do
|
38
38
|
def klass.action(name)
|
39
|
-
if name.to_s == '
|
39
|
+
if name.to_s == 'call'
|
40
40
|
proc { |env| "omg" }
|
41
41
|
end
|
42
42
|
end
|
@@ -48,8 +48,12 @@ module FocusedController
|
|
48
48
|
subject.action_name.must_equal 'show'
|
49
49
|
end
|
50
50
|
|
51
|
-
it "
|
52
|
-
subject.
|
51
|
+
it "has a #controller_name of 'posts'" do
|
52
|
+
subject.controller_name.must_equal 'posts'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "uses the call method for the action" do
|
56
|
+
subject.method_for_action('whatever').must_equal 'call'
|
53
57
|
end
|
54
58
|
|
55
59
|
it "removes all view assigns by default" do
|
@@ -62,8 +66,72 @@ module FocusedController
|
|
62
66
|
subject.view_assigns['foo'].must_equal('bar')
|
63
67
|
end
|
64
68
|
|
65
|
-
it "has a #
|
66
|
-
subject.
|
69
|
+
it "has a #call method by default" do
|
70
|
+
subject.call.must_equal nil
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '.expose' do
|
75
|
+
subject do
|
76
|
+
@klass = Class.new do
|
77
|
+
include FocusedController::Mixin
|
78
|
+
|
79
|
+
@helper_methods = []
|
80
|
+
|
81
|
+
class << self
|
82
|
+
attr_reader :helper_methods
|
83
|
+
|
84
|
+
def helper_method(name)
|
85
|
+
@helper_methods << name
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'defines a method' do
|
92
|
+
subject.expose(:foo) { 'bar' }
|
93
|
+
subject.new.foo.must_equal 'bar'
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'declares the method a helper method' do
|
97
|
+
subject.expose(:foo) { 'bar' }
|
98
|
+
subject.helper_methods.must_equal [:foo]
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'memoizes the result' do
|
102
|
+
count = 0
|
103
|
+
counter = proc { count += 1 }
|
104
|
+
subject.expose(:foo) { counter.call }
|
105
|
+
|
106
|
+
obj = subject.new
|
107
|
+
obj.foo.must_equal 1
|
108
|
+
obj.foo.must_equal 1
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'it memoizes falsey values' do
|
112
|
+
val = true
|
113
|
+
meth = proc { val = !val }
|
114
|
+
subject.expose(:foo) { meth.call }
|
115
|
+
|
116
|
+
obj = subject.new
|
117
|
+
obj.foo.must_equal false
|
118
|
+
obj.foo.must_equal false
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'instance evals the block' do
|
122
|
+
subject.expose(:foo) { @bar }
|
123
|
+
obj = subject.new
|
124
|
+
obj.instance_variable_set('@bar', 'bar')
|
125
|
+
obj.foo.must_equal 'bar'
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'declares an attr_reader when called without a block' do
|
129
|
+
subject.expose :foo
|
130
|
+
subject.helper_methods.must_equal [:foo]
|
131
|
+
|
132
|
+
obj = subject.new
|
133
|
+
obj.instance_variable_set('@foo', 'bar')
|
134
|
+
obj.foo.must_equal 'bar'
|
67
135
|
end
|
68
136
|
end
|
69
137
|
end
|
@@ -27,7 +27,8 @@ module FocusedController
|
|
27
27
|
it 'creates routes that map to focused controllers' do
|
28
28
|
route_set.draw do
|
29
29
|
focused_controller_routes do
|
30
|
-
match 'posts'
|
30
|
+
match 'posts' => 'PostsController::Index'
|
31
|
+
match 'posts/all' => 'posts#index'
|
31
32
|
|
32
33
|
resources :comments do
|
33
34
|
resources :replies
|
@@ -43,6 +44,7 @@ module FocusedController
|
|
43
44
|
|
44
45
|
mappings = {
|
45
46
|
[:get, '/posts'] => 'PostsController::Index',
|
47
|
+
[:get, '/posts/all'] => 'PostsController::Index',
|
46
48
|
[:get, '/comments'] => 'CommentsController::Index',
|
47
49
|
[:get, '/comments/4'] => 'CommentsController::Show',
|
48
50
|
[:put, '/comments/4'] => 'CommentsController::Update',
|
@@ -54,7 +56,7 @@ module FocusedController
|
|
54
56
|
mappings.each do |(method, path), controller|
|
55
57
|
route = recognize(path, :method => method)
|
56
58
|
route.app.name.must_equal controller
|
57
|
-
route.defaults[:action].must_equal '
|
59
|
+
route.defaults[:action].must_equal 'call'
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
@@ -9,7 +9,7 @@ module FocusedController
|
|
9
9
|
end
|
10
10
|
|
11
11
|
class Index < Action
|
12
|
-
def
|
12
|
+
def call
|
13
13
|
if params[:omg]
|
14
14
|
"omg"
|
15
15
|
elsif params[:set_session]
|
@@ -86,6 +86,8 @@ module FocusedController
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
+
let(:controller) { subject.controller }
|
90
|
+
|
89
91
|
subject { FakePostsController::IndexTest.new }
|
90
92
|
|
91
93
|
def must_fail(&block)
|
@@ -149,13 +151,17 @@ module FocusedController
|
|
149
151
|
end
|
150
152
|
|
151
153
|
it 'supports session' do
|
152
|
-
|
154
|
+
controller.params = { :set_session => true }
|
155
|
+
controller.call
|
156
|
+
|
153
157
|
subject.session[:foo].must_equal 'omg'
|
154
158
|
subject.session['foo'].must_equal 'omg'
|
155
159
|
end
|
156
160
|
|
157
161
|
it 'supports flash' do
|
158
|
-
|
162
|
+
controller.params = { :set_flash => true }
|
163
|
+
controller.call
|
164
|
+
|
159
165
|
subject.flash[:foo].must_equal 'omg'
|
160
166
|
|
161
167
|
# This is consistent with the behaviour of standard rails functional tests
|
@@ -163,40 +169,10 @@ module FocusedController
|
|
163
169
|
end
|
164
170
|
|
165
171
|
it 'supports cookies' do
|
166
|
-
|
167
|
-
|
168
|
-
end
|
169
|
-
|
170
|
-
describe "#req" do
|
171
|
-
it "sets params and calls the controller's #run" do
|
172
|
-
subject.req(:omg => true).must_equal 'omg'
|
173
|
-
end
|
174
|
-
|
175
|
-
it 'sets session' do
|
176
|
-
subject.req(nil, { :foo => 'bar' })
|
177
|
-
subject.session[:foo].must_equal 'bar'
|
178
|
-
end
|
172
|
+
controller.params = { :set_cookie => true }
|
173
|
+
controller.call
|
179
174
|
|
180
|
-
|
181
|
-
subject.req(nil, nil, { :foo => 'bar' })
|
182
|
-
subject.flash[:foo].must_equal 'bar'
|
183
|
-
end
|
184
|
-
|
185
|
-
it "doesn't overwrite existing params, session, or flash if new ones aren't provided" do
|
186
|
-
subject.controller.params[:param] = true
|
187
|
-
subject.controller.flash[:flash] = true
|
188
|
-
subject.controller.session[:session] = true
|
189
|
-
|
190
|
-
subject.req
|
191
|
-
|
192
|
-
subject.controller.params[:param].must_equal true
|
193
|
-
subject.controller.flash[:flash].must_equal true
|
194
|
-
subject.controller.session[:session].must_equal true
|
195
|
-
|
196
|
-
subject.req({})
|
197
|
-
|
198
|
-
subject.controller.params[:param].must_equal(nil)
|
199
|
-
end
|
175
|
+
subject.cookies[:foo].must_equal 'omg'
|
200
176
|
end
|
201
177
|
|
202
178
|
describe 'url stubbing' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: focused_controller
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,85 +21,125 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: minitest
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version: 2.11
|
37
|
+
version: '2.11'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '2.11'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: capybara
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
42
52
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.1
|
53
|
+
version: '1.1'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.1'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: capybara_minitest_spec
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
53
68
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.2
|
69
|
+
version: '0.2'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0.2'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: poltergeist
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ~>
|
64
84
|
- !ruby/object:Gem::Version
|
65
|
-
version: 0.
|
85
|
+
version: '0.7'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0.7'
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: rspec
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ~>
|
75
100
|
- !ruby/object:Gem::Version
|
76
|
-
version: 2.8
|
101
|
+
version: '2.8'
|
77
102
|
type: :development
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '2.8'
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: rspec-rails
|
82
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
83
113
|
none: false
|
84
114
|
requirements:
|
85
115
|
- - ~>
|
86
116
|
- !ruby/object:Gem::Version
|
87
|
-
version: 2.8
|
117
|
+
version: '2.8'
|
88
118
|
type: :development
|
89
119
|
prerelease: false
|
90
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '2.8'
|
91
126
|
- !ruby/object:Gem::Dependency
|
92
127
|
name: appraisal
|
93
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
94
129
|
none: false
|
95
130
|
requirements:
|
96
131
|
- - ~>
|
97
132
|
- !ruby/object:Gem::Version
|
98
|
-
version: 0.4
|
133
|
+
version: '0.4'
|
99
134
|
type: :development
|
100
135
|
prerelease: false
|
101
|
-
version_requirements:
|
102
|
-
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0.4'
|
142
|
+
description: Write Rails controllers with one class per action
|
103
143
|
email:
|
104
144
|
- j@jonathanleighton.com
|
105
145
|
executables: []
|
@@ -110,6 +150,7 @@ files:
|
|
110
150
|
- .travis.yml
|
111
151
|
- Appraisals
|
112
152
|
- Gemfile
|
153
|
+
- LICENSE
|
113
154
|
- README.md
|
114
155
|
- Rakefile
|
115
156
|
- focused_controller.gemspec
|
@@ -212,10 +253,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
253
|
version: '0'
|
213
254
|
requirements: []
|
214
255
|
rubyforge_project: focused_controller
|
215
|
-
rubygems_version: 1.8.
|
256
|
+
rubygems_version: 1.8.24
|
216
257
|
signing_key:
|
217
258
|
specification_version: 3
|
218
|
-
summary: Write Rails controllers
|
259
|
+
summary: Write Rails controllers with one class per action
|
219
260
|
test_files:
|
220
261
|
- test/acceptance/app_test.rb
|
221
262
|
- test/app/.gitignore
|
@@ -282,4 +323,3 @@ test_files:
|
|
282
323
|
- test/unit/rspec_functional_helper.rb
|
283
324
|
- test/unit/rspec_helper_test.rb
|
284
325
|
- test/unit/test_helper_test.rb
|
285
|
-
has_rdoc:
|