action_args 1.5.4 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +12 -8
- data/CONTRIBUTING.md +5 -4
- data/README.md +6 -4
- data/Rakefile +12 -10
- data/action_args.gemspec +2 -2
- data/gemfiles/rails_edge.gemfile +19 -0
- data/lib/action_args.rb +2 -14
- data/lib/action_args/abstract_controller.rb +25 -36
- data/lib/action_args/callbacks.rb +3 -45
- data/lib/action_args/params_handler.rb +46 -40
- data/lib/action_args/version.rb +1 -1
- data/lib/generators/rails/action_args_scaffold_controller_generator.rb +0 -3
- data/test/controllers/action_args_controller_test.rb +43 -0
- data/test/controllers/hooks_test.rb +27 -0
- data/test/controllers/kwargs_controller_test.rb +30 -0
- data/test/controllers/kwargs_keyreq_controller_test.rb +30 -0
- data/test/controllers/ordinal_controller_test.rb +9 -0
- data/test/controllers/strong_parameters_test.rb +35 -0
- data/{spec → test}/fake_app.rb +33 -42
- data/{spec → test}/kwargs_controllers.rb +0 -0
- data/{spec → test}/kwargs_keyreq_controllers.rb +0 -0
- data/test/mailers/action_mailer_test.rb +8 -0
- data/test/params_handler/params_handler_test.rb +192 -0
- data/{spec/spec_helper.rb → test/test_helper.rb} +2 -7
- metadata +34 -45
- data/.rspec +0 -2
- data/gemfiles/rails_32.gemfile +0 -14
- data/gemfiles/rails_40.gemfile +0 -15
- data/lib/action_args/legacy/callbacks.rb +0 -71
- data/lib/generators/action_args/rspec/scaffold/scaffold_generator.rb +0 -18
- data/lib/generators/action_args/rspec/scaffold/templates/action_args_controller_spec.rb +0 -130
- data/spec/controllers/action_args_controller_spec.rb +0 -42
- data/spec/controllers/hooks_spec.rb +0 -31
- data/spec/controllers/kwargs_controller_spec.rb +0 -34
- data/spec/controllers/kwargs_keyreq_controller_spec.rb +0 -34
- data/spec/controllers/ordinal_controller_spec.rb +0 -11
- data/spec/controllers/strong_parameters_spec.rb +0 -34
- data/spec/mailers/action_mailer_spec.rb +0 -9
- data/spec/params_handler/params_handler_spec.rb +0 -218
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e5f4f25a659c405f12ede335715b003888d85750
|
4
|
+
data.tar.gz: 86b00b4457c7da799ce4d12d2baadf9a4c76761e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b253edeedc59dfd20bfde649b17af128570eef09214947cb961db481aaddf5fcd1ab43cc9d7236016c60a7ca832c3c0f7392c682f081515846181da7a9bf016
|
7
|
+
data.tar.gz: 9737e77da93a77c23b191ef085eb9ab40cb00a1249554da7723d51798b9cd6acc70ec24f5e00a8c530792b174ad8912b0092d43a491fd090ece7893459f73821
|
data/.travis.yml
CHANGED
@@ -1,20 +1,24 @@
|
|
1
|
-
script:
|
1
|
+
script: 'bundle exec rake -t test'
|
2
2
|
language: ruby
|
3
|
+
sudo: false
|
4
|
+
|
3
5
|
rvm:
|
4
|
-
- 1.9.3
|
5
6
|
- 2.0.0
|
6
7
|
- 2.1
|
7
|
-
- 2.2
|
8
|
+
- 2.2.3
|
8
9
|
- ruby-head
|
9
|
-
- jruby
|
10
|
+
- jruby-9.0.0.0
|
10
11
|
- rbx
|
11
12
|
matrix:
|
13
|
+
exclude:
|
14
|
+
- rvm: 2.0.0
|
15
|
+
gemfile: gemfiles/rails_edge.gemfile
|
16
|
+
- rvm: 2.1
|
17
|
+
gemfile: gemfiles/rails_edge.gemfile
|
12
18
|
allow_failures:
|
13
|
-
- rvm:
|
14
|
-
- rvm: jruby
|
19
|
+
- rvm: jruby-9.0.0.0
|
15
20
|
- rvm: rbx
|
16
21
|
gemfile:
|
17
|
-
- gemfiles/rails_32.gemfile
|
18
|
-
- gemfiles/rails_40.gemfile
|
19
22
|
- gemfiles/rails_41.gemfile
|
20
23
|
- gemfiles/rails_42.gemfile
|
24
|
+
- gemfiles/rails_edge.gemfile
|
data/CONTRIBUTING.md
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
# Contributing
|
2
2
|
|
3
|
-
## Running
|
3
|
+
## Running tests
|
4
4
|
|
5
5
|
ActionArgs has several Bundler Gemfiles, each of which bundles different version of Rails.
|
6
6
|
|
7
7
|
% ls gemfiles/*.gemfile
|
8
|
-
gemfiles/
|
8
|
+
gemfiles/rails_41.gemfile gemfiles/rails_42.gemfile rails_edge.gemfile
|
9
|
+
|
9
10
|
|
10
11
|
Via BUNDLE_GEMFILE ENV variable, you can tell Bundler which version of Rails to bundle.
|
11
12
|
|
12
|
-
$ BUNDLE_GEMFILE=gemfiles/
|
13
|
+
$ BUNDLE_GEMFILE=gemfiles/rails_42.gemfile bundle ex rake test
|
13
14
|
|
14
15
|
Simply executing this command would probably run all tests against each version of Rails:
|
15
16
|
|
16
|
-
% rake
|
17
|
+
% rake test:all
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# ActionArgs
|
2
2
|
|
3
|
-
Controller action arguments parameterizer for Rails
|
3
|
+
Controller action arguments parameterizer for Rails 4.1+
|
4
4
|
|
5
5
|
|
6
6
|
## What is this?
|
@@ -28,7 +28,7 @@ This allows you to explicitly state which members of the `params` Hash are used
|
|
28
28
|
|
29
29
|
### Required Parameters (:req)
|
30
30
|
Method parameters that you specify are required. If a key of the same name does not exist in the params Hash,
|
31
|
-
ActionContrller::BadRequest
|
31
|
+
ActionContrller::BadRequest is raised.
|
32
32
|
|
33
33
|
In this `show` action, ActionArgs will require that `id` parameter is provided.
|
34
34
|
```ruby
|
@@ -220,9 +220,11 @@ You may notice that
|
|
220
220
|
|
221
221
|
## Supported versions
|
222
222
|
|
223
|
-
* Ruby
|
223
|
+
* Ruby 2.0.0, 2.1.x, 2.2.x, 2.3.0 (trunk), JRuby, & Rubinius with 2.0+ mode
|
224
224
|
|
225
|
-
* Rails
|
225
|
+
* Rails 4.1.x, 4.2.x, 5.0 (edge)
|
226
|
+
|
227
|
+
Please use Version 1.5.4 for Rails 4.0.x.
|
226
228
|
|
227
229
|
|
228
230
|
## Installation
|
data/Rakefile
CHANGED
@@ -1,29 +1,31 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
3
|
|
4
|
-
require '
|
5
|
-
require 'rspec/core/rake_task'
|
4
|
+
require 'rake/testtask'
|
6
5
|
|
7
|
-
|
8
|
-
|
6
|
+
Rake::TestTask.new do |t|
|
7
|
+
t.libs << "test"
|
8
|
+
t.pattern = 'test/**/*_test.rb'
|
9
|
+
t.warning = true
|
10
|
+
t.verbose = true
|
9
11
|
end
|
10
12
|
|
11
|
-
task :default => '
|
13
|
+
task :default => 'test:all'
|
12
14
|
|
13
|
-
namespace :
|
14
|
-
%w(
|
15
|
+
namespace :test do
|
16
|
+
%w(rails_41 rails_42 rails_edge).each do |gemfile|
|
15
17
|
desc "Run Tests against #{gemfile}"
|
16
18
|
task gemfile do
|
17
19
|
sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle --quiet"
|
18
|
-
sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle exec rake -t
|
20
|
+
sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle exec rake -t test"
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
24
|
desc 'Run Tests against all Rails versions'
|
23
25
|
task :all do
|
24
|
-
%w(
|
26
|
+
%w(rails_41 rails_42 rails_edge).each do |gemfile|
|
25
27
|
sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle --quiet"
|
26
|
-
sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle exec rake
|
28
|
+
sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle exec rake -t test"
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
data/action_args.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ['Akira Matsuda']
|
10
10
|
s.email = ['ronnie@dio.jp']
|
11
11
|
s.homepage = 'http://asakusa.rubyist.net/'
|
12
|
-
s.summary = 'Controller action arguments parameterizer for Rails
|
12
|
+
s.summary = 'Controller action arguments parameterizer for Rails 4+ & Ruby 2.0+'
|
13
13
|
s.description = 'Rails plugin gem that supports Merbish style controller action arguments.'
|
14
14
|
|
15
15
|
s.rubyforge_project = 'action_args'
|
@@ -21,5 +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 '
|
24
|
+
s.add_development_dependency 'test-unit-rails'
|
25
25
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gem 'rails', github: 'rails/rails'
|
4
|
+
gem 'rack', github: 'rack/rack'
|
5
|
+
gem 'arel', github: 'rails/arel'
|
6
|
+
gem 'sprockets', github: 'rails/sprockets'
|
7
|
+
gem 'sprockets-rails', github: 'rails/sprockets-rails'
|
8
|
+
gem 'sass-rails', github: 'rails/sass-rails'
|
9
|
+
gem 'rails-controller-testing'
|
10
|
+
|
11
|
+
gemspec :path => '../'
|
12
|
+
|
13
|
+
platforms :ruby do
|
14
|
+
gem 'sqlite3'
|
15
|
+
end
|
16
|
+
|
17
|
+
platforms :jruby do
|
18
|
+
gem 'activerecord-jdbcsqlite3-adapter'
|
19
|
+
end
|
data/lib/action_args.rb
CHANGED
@@ -1,21 +1,9 @@
|
|
1
|
-
begin
|
2
|
-
require 'strong_parameters'
|
3
|
-
rescue LoadError
|
4
|
-
end
|
5
1
|
require 'action_args/params_handler'
|
6
2
|
require 'action_args/abstract_controller'
|
7
|
-
|
8
|
-
require 'action_args/callbacks'
|
9
|
-
else
|
10
|
-
require 'action_args/legacy/callbacks'
|
11
|
-
end
|
3
|
+
require 'action_args/callbacks'
|
12
4
|
|
13
5
|
module ActionArgs
|
14
6
|
class Railtie < ::Rails::Railtie
|
15
|
-
|
16
|
-
config.app_generators.scaffold_controller = :action_args_scaffold_controller
|
17
|
-
else
|
18
|
-
config.generators.scaffold_controller = :action_args_scaffold_controller
|
19
|
-
end
|
7
|
+
config.app_generators.scaffold_controller = :action_args_scaffold_controller
|
20
8
|
end
|
21
9
|
end
|
@@ -1,44 +1,33 @@
|
|
1
|
+
require_relative 'params_handler'
|
2
|
+
using ActionArgs::ParamsHandler
|
3
|
+
|
1
4
|
module AbstractController
|
2
5
|
class Base
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
return send method_name, *args unless defined?(params)
|
7
|
-
|
8
|
-
method_parameters = method(method_name).parameters
|
9
|
-
ActionArgs::ParamsHandler.strengthen_params!(self.class, method_parameters, params)
|
10
|
-
values = ActionArgs::ParamsHandler.extract_method_arguments_from_params method_parameters, params
|
11
|
-
send method_name, *values
|
12
|
-
end
|
6
|
+
def send_action(method_name, *args)
|
7
|
+
return send method_name, *args unless args.empty?
|
8
|
+
return send method_name, *args unless defined?(params)
|
13
9
|
|
14
|
-
|
15
|
-
|
16
|
-
# model name inferred from the controller class name.
|
17
|
-
#
|
18
|
-
# class UsersController < ApplicationController
|
19
|
-
# permits :name, :age
|
20
|
-
#
|
21
|
-
# def create(user)
|
22
|
-
# @user = User.new(user)
|
23
|
-
# end
|
24
|
-
# end
|
25
|
-
#
|
26
|
-
def self.permits(*attributes)
|
27
|
-
if attributes.last.is_a?(Hash) && attributes.last.extractable_options? && attributes.last.has_key?(:model_name)
|
28
|
-
options = attributes.pop
|
29
|
-
@permitting_model_name = options[:model_name]
|
30
|
-
end
|
31
|
-
@permitted_attributes = attributes
|
32
|
-
end
|
33
|
-
# no StrongParameters
|
34
|
-
else
|
35
|
-
def send_action(method_name, *args)
|
36
|
-
return send method_name, *args unless args.empty?
|
37
|
-
return send method_name, *args unless defined?(params)
|
10
|
+
send_with_method_parameters_from_params method_name
|
11
|
+
end
|
38
12
|
|
39
|
-
|
40
|
-
|
13
|
+
# You can configure StrongParameters' `permit` attributes using this DSL method.
|
14
|
+
# The `permit` call will be invoked only against parameters having the resource
|
15
|
+
# model name inferred from the controller class name.
|
16
|
+
#
|
17
|
+
# class UsersController < ApplicationController
|
18
|
+
# permits :name, :age
|
19
|
+
#
|
20
|
+
# def create(user)
|
21
|
+
# @user = User.new(user)
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
def self.permits(*attributes)
|
26
|
+
if attributes.last.is_a?(Hash) && attributes.last.extractable_options? && attributes.last.has_key?(:model_name)
|
27
|
+
options = attributes.pop
|
28
|
+
@permitting_model_name = options[:model_name]
|
41
29
|
end
|
30
|
+
@permitted_attributes = attributes
|
42
31
|
end
|
43
32
|
end
|
44
33
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
+
using ActionArgs::ParamsHandler
|
2
|
+
|
1
3
|
module ActionArgs
|
2
4
|
module ActiveSupport
|
3
5
|
module CallbackParameterizer
|
4
|
-
if Rails.version > '4.1'
|
5
6
|
# Extending AS::Callbacks::Callback's `make_lambda` not just to call specified
|
6
7
|
# method but to call the method with method parameters taken from `params`.
|
7
8
|
# This would happen only when
|
@@ -11,11 +12,7 @@ module ActionArgs
|
|
11
12
|
if Symbol === filter
|
12
13
|
lambda do |target, _, &blk|
|
13
14
|
if ActionController::Base === target
|
14
|
-
|
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
|
15
|
+
target.send_with_method_parameters_from_params filter, &blk
|
19
16
|
else
|
20
17
|
target.send filter, &blk
|
21
18
|
end
|
@@ -24,45 +21,6 @@ module ActionArgs
|
|
24
21
|
super
|
25
22
|
end
|
26
23
|
end
|
27
|
-
|
28
|
-
elsif Rails.version > '4.0'
|
29
|
-
def apply(code)
|
30
|
-
if (Symbol === @filter) && (@klass < ActionController::Base)
|
31
|
-
method_body = <<-FILTER
|
32
|
-
meth = method :#{@filter}
|
33
|
-
method_parameters = meth.parameters
|
34
|
-
ActionArgs::ParamsHandler.strengthen_params!(self.class, method_parameters, params)
|
35
|
-
values = ActionArgs::ParamsHandler.extract_method_arguments_from_params method_parameters, params
|
36
|
-
send :#{@filter}, *values
|
37
|
-
FILTER
|
38
|
-
if @kind == :before
|
39
|
-
@filter = "begin\n#{method_body}\nend"
|
40
|
-
else
|
41
|
-
@filter = method_body.chomp
|
42
|
-
end
|
43
|
-
end
|
44
|
-
super
|
45
|
-
end
|
46
|
-
|
47
|
-
else # Rails 3.2
|
48
|
-
def start(key=nil, object=nil)
|
49
|
-
if (Symbol === @filter) && (@klass < ActionController::Base)
|
50
|
-
method_body = <<-FILTER
|
51
|
-
meth = method :#{@filter}
|
52
|
-
method_parameters = meth.parameters
|
53
|
-
ActionArgs::ParamsHandler.strengthen_params!(self.class, method_parameters, params)
|
54
|
-
values = ActionArgs::ParamsHandler.extract_method_arguments_from_params method_parameters, params
|
55
|
-
send :#{@filter}, *values
|
56
|
-
FILTER
|
57
|
-
if @kind == :before
|
58
|
-
@filter = "begin\n#{method_body}\nend"
|
59
|
-
else
|
60
|
-
@filter = method_body.chomp
|
61
|
-
end
|
62
|
-
end
|
63
|
-
super
|
64
|
-
end
|
65
|
-
end
|
66
24
|
end
|
67
25
|
end
|
68
26
|
end
|
@@ -1,51 +1,57 @@
|
|
1
1
|
module ActionArgs
|
2
2
|
module ParamsHandler
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
3
|
+
refine AbstractController::Base do
|
4
|
+
def send_with_method_parameters_from_params(method_name, &blk)
|
5
|
+
strengthen_params! method_name
|
6
|
+
values = extract_method_arguments_from_params method_name
|
7
|
+
send method_name, *values, &blk
|
8
|
+
end
|
9
|
+
|
10
|
+
# converts the request params Hash into an Array to be passed into the target Method
|
11
|
+
def extract_method_arguments_from_params(method_name)
|
12
|
+
method_parameters = method(method_name).parameters
|
13
|
+
kwargs, missing_required_params = {}, []
|
14
|
+
parameter_names = method_parameters.map(&:last)
|
15
|
+
method_parameters.reverse_each do |type, key|
|
16
|
+
case type
|
17
|
+
when :req
|
18
|
+
missing_required_params << key unless params.has_key? key
|
19
|
+
next
|
20
|
+
when :keyreq
|
21
|
+
if params.has_key? key
|
22
|
+
kwargs[key] = params[key]
|
23
|
+
else
|
24
|
+
missing_required_params << key
|
25
|
+
end
|
26
|
+
when :key
|
27
|
+
kwargs[key] = params[key] if params.has_key? key
|
28
|
+
when :opt
|
29
|
+
break if params.has_key? key
|
17
30
|
end
|
18
|
-
|
19
|
-
|
20
|
-
when :opt
|
21
|
-
break if params.has_key? key
|
31
|
+
# omitting parameters that are :block, :rest, :opt without a param, and :key without a param
|
32
|
+
parameter_names.delete key
|
22
33
|
end
|
23
|
-
|
24
|
-
|
25
|
-
end
|
26
|
-
if missing_required_params.any?
|
27
|
-
if defined? ActionController::BadRequest
|
28
|
-
raise ActionController::BadRequest.new(:required, ArgumentError.new("Missing required parameters: #{missing_required_params.join(', ')}"))
|
29
|
-
else
|
30
|
-
raise ArgumentError, "Missing required parameters: #{missing_required_params.join(', ')}"
|
34
|
+
if missing_required_params.any?
|
35
|
+
raise ActionController::BadRequest.new(:required, ArgumentError.new("Missing required parameters at #{self.class.name}##{method_name}: #{missing_required_params.join(', ')}"))
|
31
36
|
end
|
32
|
-
end
|
33
37
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
+
values = parameter_names.map {|k| params[k]}
|
39
|
+
values << kwargs if kwargs.any?
|
40
|
+
values
|
41
|
+
end
|
38
42
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
43
|
+
# permits declared model attributes in the params Hash
|
44
|
+
# note that this method mutates the given params Hash
|
45
|
+
def strengthen_params!(method_name)
|
46
|
+
permitting_model_name = self.class.instance_variable_defined?(:@permitting_model_name) && self.class.instance_variable_get(:@permitting_model_name)
|
47
|
+
target_model_name = (permitting_model_name || self.class.name.sub(/.+::/, '').sub(/Controller$/, '')).singularize.underscore.tr('/', '_').to_sym
|
48
|
+
permitted_attributes = self.class.instance_variable_defined?(:@permitted_attributes) && self.class.instance_variable_get(:@permitted_attributes)
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
50
|
+
method_parameters = method(method_name).parameters
|
51
|
+
method_parameters.each do |type, key|
|
52
|
+
if (key == target_model_name) && permitted_attributes
|
53
|
+
params[key] = params.require(key).try :permit, *permitted_attributes
|
54
|
+
end
|
49
55
|
end
|
50
56
|
end
|
51
57
|
end
|
data/lib/action_args/version.rb
CHANGED