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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +12 -8
  3. data/CONTRIBUTING.md +5 -4
  4. data/README.md +6 -4
  5. data/Rakefile +12 -10
  6. data/action_args.gemspec +2 -2
  7. data/gemfiles/rails_edge.gemfile +19 -0
  8. data/lib/action_args.rb +2 -14
  9. data/lib/action_args/abstract_controller.rb +25 -36
  10. data/lib/action_args/callbacks.rb +3 -45
  11. data/lib/action_args/params_handler.rb +46 -40
  12. data/lib/action_args/version.rb +1 -1
  13. data/lib/generators/rails/action_args_scaffold_controller_generator.rb +0 -3
  14. data/test/controllers/action_args_controller_test.rb +43 -0
  15. data/test/controllers/hooks_test.rb +27 -0
  16. data/test/controllers/kwargs_controller_test.rb +30 -0
  17. data/test/controllers/kwargs_keyreq_controller_test.rb +30 -0
  18. data/test/controllers/ordinal_controller_test.rb +9 -0
  19. data/test/controllers/strong_parameters_test.rb +35 -0
  20. data/{spec → test}/fake_app.rb +33 -42
  21. data/{spec → test}/kwargs_controllers.rb +0 -0
  22. data/{spec → test}/kwargs_keyreq_controllers.rb +0 -0
  23. data/test/mailers/action_mailer_test.rb +8 -0
  24. data/test/params_handler/params_handler_test.rb +192 -0
  25. data/{spec/spec_helper.rb → test/test_helper.rb} +2 -7
  26. metadata +34 -45
  27. data/.rspec +0 -2
  28. data/gemfiles/rails_32.gemfile +0 -14
  29. data/gemfiles/rails_40.gemfile +0 -15
  30. data/lib/action_args/legacy/callbacks.rb +0 -71
  31. data/lib/generators/action_args/rspec/scaffold/scaffold_generator.rb +0 -18
  32. data/lib/generators/action_args/rspec/scaffold/templates/action_args_controller_spec.rb +0 -130
  33. data/spec/controllers/action_args_controller_spec.rb +0 -42
  34. data/spec/controllers/hooks_spec.rb +0 -31
  35. data/spec/controllers/kwargs_controller_spec.rb +0 -34
  36. data/spec/controllers/kwargs_keyreq_controller_spec.rb +0 -34
  37. data/spec/controllers/ordinal_controller_spec.rb +0 -11
  38. data/spec/controllers/strong_parameters_spec.rb +0 -34
  39. data/spec/mailers/action_mailer_spec.rb +0 -9
  40. 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: a7062ef48bdc9ea5251edabde8741bd59a94a053
4
- data.tar.gz: 99a982870ef9d599448c17e00457a5663d847e16
3
+ metadata.gz: e5f4f25a659c405f12ede335715b003888d85750
4
+ data.tar.gz: 86b00b4457c7da799ce4d12d2baadf9a4c76761e
5
5
  SHA512:
6
- metadata.gz: 3844a31080e5f9dd72f720ce3f747999773b50265dbc44892ca6e32e35cd8116e05b37d7a3bac0a267a5e9cb3821a1d33f8bd4815a29b7d4cc8d25663a89974b
7
- data.tar.gz: 61d4f1c96d1a9da789452113e9fc32c900daeaa891e4aeb6f7e07f1e78027de6b1ed5ae191a6567e2cc6cc4ea1cdf4f88e9308d3d5f83807d901af29214074b2
6
+ metadata.gz: 4b253edeedc59dfd20bfde649b17af128570eef09214947cb961db481aaddf5fcd1ab43cc9d7236016c60a7ca832c3c0f7392c682f081515846181da7a9bf016
7
+ data.tar.gz: 9737e77da93a77c23b191ef085eb9ab40cb00a1249554da7723d51798b9cd6acc70ec24f5e00a8c530792b174ad8912b0092d43a491fd090ece7893459f73821
@@ -1,20 +1,24 @@
1
- script: "bundle exec rake spec"
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: ruby-head
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
@@ -1,16 +1,17 @@
1
1
  # Contributing
2
2
 
3
- ## Running specs
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/rails_32.gemfile gemfiles/rails_40.gemfile gemfiles/rails_41.gemfile
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/rails_40.gemfile bundle ex rake spec
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 spec:all
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 and 4
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 (or ArgumentError in Rails 3) is raised.
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 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
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 3.0.x, 3.1.x, 3.2.x, 4.0.x, 4.1.x, 4.2.x, 5.0 (edge)
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 'rspec/core'
5
- require 'rspec/core/rake_task'
4
+ require 'rake/testtask'
6
5
 
7
- RSpec::Core::RakeTask.new(:spec) do |spec|
8
- spec.pattern = FileList['spec/**/*_spec.rb']
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 => 'spec:all'
13
+ task :default => 'test:all'
12
14
 
13
- namespace :spec do
14
- %w(rails_32 rails_40 rails_41 rails_42).each do |gemfile|
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 spec"
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(rails_32 rails_40 rails_41 rails_42).each do |gemfile|
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 spec"
28
+ sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle exec rake -t test"
27
29
  end
28
30
  end
29
31
  end
@@ -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 3+ & Ruby 1.9+'
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 'rspec-rails', ['~> 2.0', '< 2.99']
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
@@ -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
- if ActionArgs.respond_to? :prepend
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
- if config.respond_to? :app_generators
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
- if defined? ActionController::StrongParameters
4
- def send_action(method_name, *args)
5
- return send method_name, *args unless args.empty?
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
- # You can configure StrongParameters' `permit` attributes using this DSL method.
15
- # The `permit` call will be invoked only against parameters having the resource
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
- values = ActionArgs::ParamsHandler.extract_method_arguments_from_params method(method_name).parameters, params
40
- send method_name, *values
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
- 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
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
- # converts the request params Hash into an Array to be passed into the target Method
4
- def self.extract_method_arguments_from_params(method_parameters, params)
5
- kwargs, missing_required_params = {}, []
6
- parameter_names = method_parameters.map(&:last)
7
- method_parameters.reverse_each do |type, key|
8
- case type
9
- when :req
10
- missing_required_params << key unless params.has_key? key
11
- next
12
- when :keyreq
13
- if params.has_key? key
14
- kwargs[key] = params[key]
15
- else
16
- missing_required_params << key
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
- when :key
19
- kwargs[key] = params[key] if params.has_key? key
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
- # omitting parameters that are :block, :rest, :opt without a param, and :key without a param
24
- parameter_names.delete key
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
- values = parameter_names.map {|k| params[k]}
35
- values << kwargs if kwargs.any?
36
- values
37
- end
38
+ values = parameter_names.map {|k| params[k]}
39
+ values << kwargs if kwargs.any?
40
+ values
41
+ end
38
42
 
39
- # permits declared model attributes in the params Hash
40
- # note that this method mutates the given params Hash
41
- def self.strengthen_params!(controller_class, method_parameters, params)
42
- permitting_model_name = controller_class.instance_variable_defined?(:@permitting_model_name) && controller_class.instance_variable_get(:@permitting_model_name)
43
- target_model_name = (permitting_model_name || controller_class.name.sub(/.+::/, '').sub(/Controller$/, '')).singularize.underscore.tr('/', '_').to_sym
44
- permitted_attributes = controller_class.instance_variable_defined?(:@permitted_attributes) && controller_class.instance_variable_get(:@permitted_attributes)
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
- method_parameters.each do |type, key|
47
- if (key == target_model_name) && permitted_attributes
48
- params[key] = params.require(key).try :permit, *permitted_attributes
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
@@ -1,3 +1,3 @@
1
1
  module ActionArgs
2
- VERSION = '1.5.4'
2
+ VERSION = '2.0.0'
3
3
  end
@@ -10,6 +10,3 @@ module Rails
10
10
  end
11
11
  end
12
12
  end
13
-
14
- # load custom rspec generator
15
- require 'generators/action_args/rspec/scaffold/scaffold_generator' if defined? ::RSpec::Rails