action_args 1.4.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 08400217d2c2140b99d452215b2c61abf84e4970
4
- data.tar.gz: 497ce69932a416822d0091fac672635da7c74e1d
3
+ metadata.gz: f1be64c562566fa50677fd49064390945ef09e08
4
+ data.tar.gz: 579d02790193ebe0bb9bd3fc032ca29785b1f28c
5
5
  SHA512:
6
- metadata.gz: 611853b0ba4d24a9af960f3e3c39a17155efab017b4bf4703dbf3bb19db13633da2f7f8a66c53270de3aa21fdec0afd7e4753d45978fc602c2dff406d9374165
7
- data.tar.gz: 1c513207a195c7293122f487c24aa1f493e8747823191e09a1d0e8c9682b0372b908cb0c3f98c5b7b1e11b811739ed780a358b00ee4aa1f9a8467c15a79b3b17
6
+ metadata.gz: dcbe4c44a809e0fde4684c288c56f00b5595ffad2a38b6afd0bf2e14820d8694c949bb00f3b0c37bc3e5c8fb4ae1b88c48625e20fedbf52536b3c98c913ce960
7
+ data.tar.gz: 81d8cc112ced51eee850a17bd6f58441ecce23b7c8a976b0ab980d053a26b4cf85688b9096174e6ad34c4d7ac902d55e384bb06fec8a4f7582ef9498686fe05d
data/.travis.yml CHANGED
@@ -4,15 +4,17 @@ rvm:
4
4
  - 1.9.3
5
5
  - 2.0.0
6
6
  - 2.1
7
+ - 2.2
7
8
  - ruby-head
8
9
  - jruby
9
- - rbx-19mode
10
+ - rbx
10
11
  matrix:
11
12
  allow_failures:
12
13
  - rvm: ruby-head
13
14
  - rvm: jruby
14
- - rvm: rbx-19mode
15
+ - rvm: rbx
15
16
  gemfile:
16
17
  - gemfiles/rails_32.gemfile
17
18
  - gemfiles/rails_40.gemfile
18
19
  - gemfiles/rails_41.gemfile
20
+ - gemfiles/rails_42.gemfile
data/README.md CHANGED
@@ -21,7 +21,7 @@ end
21
21
  ```
22
22
 
23
23
  Hitting "/hoge/fuga?piyo=foo" will call `fuga('foo')` and output 'foo'.
24
- This allows you to explicitly state which members of the `params` Hash are used in your controller actions,
24
+ This allows you to explicitly state which members of the `params` Hash are used in your controller actions.
25
25
 
26
26
 
27
27
  ## Method parameter types in Ruby, and how ActionArgs handles parameters
@@ -124,6 +124,25 @@ class MembersController < ApplicationController
124
124
  end
125
125
  ```
126
126
 
127
+ ## Filters
128
+
129
+ ActionArgs works in filters, in the same way as it works in controller actions.
130
+
131
+ ```ruby
132
+ class UsersController < ApplicationController
133
+ before_action :set_user, only: :show
134
+
135
+ def show
136
+ end
137
+
138
+ private
139
+ # `params[:id]` will be dynamically assigned to the method parameter `id` here
140
+ def set_user(id)
141
+ @user = User.find(id)
142
+ end
143
+ end
144
+ ```
145
+
127
146
  ## The Scaffold Generator
128
147
 
129
148
  ActionArgs provides a custom scaffold controller generator that overwrites the default scaffold generator.
@@ -139,6 +158,7 @@ The following elegant controller code will be generated:
139
158
  # coding: utf-8
140
159
 
141
160
  class UsersController < ApplicationController
161
+ before_action :set_user, only: [:show, :edit, :update, :destroy]
142
162
  permits :name, :age, :email
143
163
 
144
164
  # GET /users
@@ -147,8 +167,7 @@ class UsersController < ApplicationController
147
167
  end
148
168
 
149
169
  # GET /users/1
150
- def show(id)
151
- @user = User.find(id)
170
+ def show
152
171
  end
153
172
 
154
173
  # GET /users/new
@@ -157,8 +176,7 @@ class UsersController < ApplicationController
157
176
  end
158
177
 
159
178
  # GET /users/1/edit
160
- def edit(id)
161
- @user = User.find(id)
179
+ def edit
162
180
  end
163
181
 
164
182
  # POST /users
@@ -173,9 +191,7 @@ class UsersController < ApplicationController
173
191
  end
174
192
 
175
193
  # PUT /users/1
176
- def update(id, user)
177
- @user = User.find(id)
178
-
194
+ def update(user)
179
195
  if @user.update_attributes(user)
180
196
  redirect_to @user, notice: 'User was successfully updated.'
181
197
  else
@@ -184,12 +200,17 @@ class UsersController < ApplicationController
184
200
  end
185
201
 
186
202
  # DELETE /users/1
187
- def destroy(id)
188
- @user = User.find(id)
203
+ def destroy
189
204
  @user.destroy
190
205
 
191
206
  redirect_to users_url
192
207
  end
208
+
209
+ private
210
+ # Use callbacks to share common setup or constraints between actions.
211
+ def set_user(id)
212
+ @user = User.find(id)
213
+ end
193
214
  end
194
215
  ```
195
216
 
@@ -201,9 +222,9 @@ You may notice that
201
222
 
202
223
  ## Supported versions
203
224
 
204
- * Ruby 1.9.2, 1.9.3, 2.0.0, 2.1.x, 2.2.0 (trunk), JRuby, & Rubinius with 1.9+ mode
225
+ * Ruby 1.9.2, 1.9.3, 2.0.0, 2.1.x, 2.2.x, 2.3.0 (trunk), JRuby, & Rubinius with 1.9+ mode
205
226
 
206
- * Rails 3.0.x, 3.1.x, 3.2.x, 4.0.x, 4.1.x, 4.2 (edge)
227
+ * Rails 3.0.x, 3.1.x, 3.2.x, 4.0.x, 4.1.x, 4.2.x, 5.0 (edge)
207
228
 
208
229
 
209
230
  ## Installation
data/action_args.gemspec CHANGED
@@ -21,4 +21,5 @@ Gem::Specification.new do |s|
21
21
 
22
22
  s.add_development_dependency 'bundler'
23
23
  s.add_development_dependency 'rake'
24
+ s.add_development_dependency 'rspec-rails', ['~> 2.0', '< 2.99']
24
25
  end
@@ -1,7 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 3.2.9'
4
- gem 'rspec-rails', '~> 2.0', '< 2.99'
5
4
 
6
5
  gemspec :path => '../'
7
6
 
@@ -12,3 +11,4 @@ end
12
11
  platforms :jruby do
13
12
  gem 'activerecord-jdbcsqlite3-adapter'
14
13
  end
14
+ gem 'test-unit'
@@ -1,7 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 4.0.0'
4
- gem 'rspec-rails', '~> 2.0', '< 2.99'
5
4
 
6
5
  gemspec :path => '../'
7
6
 
@@ -12,3 +11,5 @@ end
12
11
  platforms :jruby do
13
12
  gem 'activerecord-jdbcsqlite3-adapter'
14
13
  end
14
+
15
+ gem 'test-unit'
@@ -1,7 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 4.1.0'
4
- gem 'rspec-rails', '~> 2.0', '< 2.99'
5
4
 
6
5
  gemspec :path => '../'
7
6
 
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.2.0'
4
+
5
+ gemspec :path => '../'
6
+
7
+ platforms :ruby do
8
+ gem 'sqlite3'
9
+ end
10
+
11
+ platforms :jruby do
12
+ gem 'activerecord-jdbcsqlite3-adapter'
13
+ end
data/lib/action_args.rb CHANGED
@@ -4,6 +4,7 @@ rescue LoadError
4
4
  end
5
5
  require 'action_args/params_handler'
6
6
  require 'action_args/abstract_controller'
7
+ require 'action_args/callbacks'
7
8
 
8
9
  module ActionArgs
9
10
  class Railtie < ::Rails::Railtie
@@ -0,0 +1,71 @@
1
+ module ActiveSupport
2
+ module Callbacks
3
+ class Callback
4
+ if Rails.version > '4.1'
5
+ # Extending AS::Callbacks::Callback's `make_lambda` not just to call specified
6
+ # method but to call the method with method parameters taken from `params`.
7
+ # This would happen only when
8
+ # * the filter was defined in Symbol form
9
+ # * the target object is_a ActionController object
10
+ def make_lambda_with_method_parameters(filter)
11
+ if Symbol === filter
12
+ lambda do |target, _, &blk|
13
+ if ActionController::Base === target
14
+ meth = target.method filter
15
+ method_parameters = meth.parameters
16
+ ActionArgs::ParamsHandler.strengthen_params!(target.class, method_parameters, target.params)
17
+ values = ActionArgs::ParamsHandler.extract_method_arguments_from_params method_parameters, target.params
18
+ target.send filter, *values, &blk
19
+ else
20
+ target.send filter, &blk
21
+ end
22
+ end
23
+ else
24
+ make_lambda_without_method_parameters filter
25
+ end
26
+ end
27
+ alias_method_chain :make_lambda, :method_parameters
28
+
29
+ elsif Rails.version > '4.0'
30
+ def apply_with_method_parameters(code)
31
+ if (Symbol === @filter) && (@klass < ActionController::Base)
32
+ method_body = <<-FILTER
33
+ meth = method :#{@filter}
34
+ method_parameters = meth.parameters
35
+ ActionArgs::ParamsHandler.strengthen_params!(self.class, method_parameters, params)
36
+ values = ActionArgs::ParamsHandler.extract_method_arguments_from_params method_parameters, params
37
+ send :#{@filter}, *values
38
+ FILTER
39
+ if @kind == :before
40
+ @filter = "begin\n#{method_body}\nend"
41
+ else
42
+ @filter = method_body.chomp
43
+ end
44
+ end
45
+ apply_without_method_parameters code
46
+ end
47
+ alias_method_chain :apply, :method_parameters
48
+
49
+ else # Rails 3.2
50
+ def start_with_method_parameters(key=nil, object=nil)
51
+ if (Symbol === @filter) && (@klass < ActionController::Base)
52
+ method_body = <<-FILTER
53
+ meth = method :#{@filter}
54
+ method_parameters = meth.parameters
55
+ ActionArgs::ParamsHandler.strengthen_params!(self.class, method_parameters, params)
56
+ values = ActionArgs::ParamsHandler.extract_method_arguments_from_params method_parameters, params
57
+ send :#{@filter}, *values
58
+ FILTER
59
+ if @kind == :before
60
+ @filter = "begin\n#{method_body}\nend"
61
+ else
62
+ @filter = method_body.chomp
63
+ end
64
+ end
65
+ start_without_method_parameters key, object
66
+ end
67
+ alias_method_chain :start, :method_parameters
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,3 +1,3 @@
1
1
  module ActionArgs
2
- VERSION = '1.4.0'.freeze
2
+ VERSION = '1.5.1'.freeze
3
3
  end
@@ -1,6 +1,7 @@
1
1
  # coding: utf-8
2
2
 
3
3
  class <%= controller_class_name %>Controller < ApplicationController
4
+ before_action :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy]
4
5
  <% if defined? ActionController::StrongParameters -%>
5
6
  permits <%= attributes.map {|a| ":#{a.name}" }.join(', ') %>
6
7
 
@@ -11,8 +12,7 @@ class <%= controller_class_name %>Controller < ApplicationController
11
12
  end
12
13
 
13
14
  # GET <%= route_url %>/1
14
- def show(id)
15
- @<%= singular_table_name %> = <%= orm_class.find(class_name, 'id') %>
15
+ def show
16
16
  end
17
17
 
18
18
  # GET <%= route_url %>/new
@@ -21,8 +21,7 @@ class <%= controller_class_name %>Controller < ApplicationController
21
21
  end
22
22
 
23
23
  # GET <%= route_url %>/1/edit
24
- def edit(id)
25
- @<%= singular_table_name %> = <%= orm_class.find(class_name, 'id') %>
24
+ def edit
26
25
  end
27
26
 
28
27
  # POST <%= route_url %>
@@ -37,9 +36,7 @@ class <%= controller_class_name %>Controller < ApplicationController
37
36
  end
38
37
 
39
38
  # PUT <%= route_url %>/1
40
- def update(id, <%= singular_table_name %>)
41
- @<%= singular_table_name %> = <%= orm_class.find(class_name, 'id') %>
42
-
39
+ def update(<%= singular_table_name %>)
43
40
  <% if orm_instance.respond_to? :update -%>
44
41
  if @<%= orm_instance.update(singular_table_name) %>
45
42
  <% else -%>
@@ -52,10 +49,15 @@ class <%= controller_class_name %>Controller < ApplicationController
52
49
  end
53
50
 
54
51
  # DELETE <%= route_url %>/1
55
- def destroy(id)
56
- @<%= singular_table_name %> = <%= orm_class.find(class_name, 'id') %>
52
+ def destroy
57
53
  @<%= orm_instance.destroy %>
58
54
 
59
55
  redirect_to <%= index_helper %>_url, notice: <%= "'#{human_name} was successfully destroyed.'" %>
60
56
  end
57
+
58
+ private
59
+ # Use callbacks to share common setup or constraints between actions.
60
+ def set_<%= singular_table_name %>(id)
61
+ @<%= singular_table_name %> = <%= orm_class.find(class_name, 'id') %>
62
+ end
61
63
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe BooksController, 'action hooks' do
4
+ before do
5
+ Book.delete_all
6
+ @book = Book.create! title: 'Head First ActionArgs'
7
+ get :show, id: @book.id
8
+ end
9
+
10
+ describe 'before_action' do
11
+ context 'via Symbol' do
12
+ subject { assigns :book }
13
+ it { should == @book }
14
+ end
15
+
16
+ context 'via String' do
17
+ subject { assigns :string_filter_executed }
18
+ it { should be_true }
19
+ end
20
+
21
+ context 'via Proc' do
22
+ subject { assigns :proc_filter_executed }
23
+ it { should be_true }
24
+ end
25
+ end
26
+
27
+ describe 'around_action' do
28
+ subject { assigns :elapsed_time }
29
+ it { should be }
30
+ end
31
+ end
data/spec/fake_app.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # coding: utf-8
2
+
1
3
  # config
2
4
  ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
3
5
 
@@ -58,6 +60,22 @@ class AuthorsController < ApplicationController
58
60
  end
59
61
  end
60
62
  class BooksController < ApplicationController
63
+ if Rails::VERSION::MAJOR >= 4
64
+ before_action :set_book, only: :show
65
+ before_action -> { @proc_filter_executed = true }, only: :show
66
+ before_action '@string_filter_executed = true', only: :show
67
+ around_action :benchmark_action
68
+ before_action :omg
69
+ skip_before_action :omg
70
+ else
71
+ before_filter :set_book, only: :show
72
+ before_filter -> { @proc_filter_executed = true }, only: :show
73
+ before_filter '@string_filter_executed = true', only: :show
74
+ around_filter :benchmark_action
75
+ before_filter :omg
76
+ skip_before_filter :omg
77
+ end
78
+
61
79
  # optional parameter
62
80
  def index(page = 1, q = nil, limit = 10)
63
81
  @books = Book.limit(limit.to_i).offset(([page.to_i - 1, 0].max) * 10)
@@ -66,7 +84,6 @@ class BooksController < ApplicationController
66
84
  end
67
85
 
68
86
  def show(id)
69
- @book = Book.find(id)
70
87
  render text: @book.title
71
88
  end
72
89
 
@@ -75,6 +92,21 @@ class BooksController < ApplicationController
75
92
  @book = Book.create! book
76
93
  render text: @book.title
77
94
  end
95
+
96
+ private
97
+ def set_book(id)
98
+ @book = Book.find(id)
99
+ end
100
+
101
+ def benchmark_action
102
+ start = Time.now
103
+ yield
104
+ @elapsed_time = Time.now - start
105
+ end
106
+
107
+ def omg
108
+ raise '💣'
109
+ end
78
110
  end
79
111
  if Rails::VERSION::MAJOR >= 4
80
112
  class StoresController < ApplicationController
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_args
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akira Matsuda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-25 00:00:00.000000000 Z
11
+ date: 2015-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,26 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '2.99'
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '2.0'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.99'
41
61
  description: Rails plugin gem that supports Merbish style controller action arguments.
42
62
  email:
43
63
  - ronnie@dio.jp
@@ -56,8 +76,10 @@ files:
56
76
  - gemfiles/rails_32.gemfile
57
77
  - gemfiles/rails_40.gemfile
58
78
  - gemfiles/rails_41.gemfile
79
+ - gemfiles/rails_42.gemfile
59
80
  - lib/action_args.rb
60
81
  - lib/action_args/abstract_controller.rb
82
+ - lib/action_args/callbacks.rb
61
83
  - lib/action_args/params_handler.rb
62
84
  - lib/action_args/version.rb
63
85
  - lib/generators/action_args/rspec/scaffold/scaffold_generator.rb
@@ -65,6 +87,7 @@ files:
65
87
  - lib/generators/rails/action_args_scaffold_controller_generator.rb
66
88
  - lib/generators/rails/templates/controller.rb
67
89
  - spec/controllers/action_args_controller_spec.rb
90
+ - spec/controllers/hooks_spec.rb
68
91
  - spec/controllers/kwargs_controller_spec.rb
69
92
  - spec/controllers/kwargs_keyreq_controller_spec.rb
70
93
  - spec/controllers/ordinal_controller_spec.rb
@@ -94,12 +117,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
117
  version: '0'
95
118
  requirements: []
96
119
  rubyforge_project: action_args
97
- rubygems_version: 2.2.2
120
+ rubygems_version: 2.4.5
98
121
  signing_key:
99
122
  specification_version: 4
100
123
  summary: Controller action arguments parameterizer for Rails 3+ & Ruby 1.9+
101
124
  test_files:
102
125
  - spec/controllers/action_args_controller_spec.rb
126
+ - spec/controllers/hooks_spec.rb
103
127
  - spec/controllers/kwargs_controller_spec.rb
104
128
  - spec/controllers/kwargs_keyreq_controller_spec.rb
105
129
  - spec/controllers/ordinal_controller_spec.rb