action_args 1.5.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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