action_args 0.0.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,4 +1,6 @@
1
1
  *.gem
2
2
  .bundle
3
3
  Gemfile.lock
4
+ gemfiles/*.lock
4
5
  pkg/*
6
+ log/*.log
data/.travis.yml ADDED
@@ -0,0 +1,15 @@
1
+ script: "bundle exec rake spec"
2
+ language: ruby
3
+ rvm:
4
+ - 1.9.3
5
+ - ruby-head
6
+ - jruby-head
7
+ - rbx-19mode
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: ruby-head
11
+ - rvm: jruby-head
12
+ - rvm: rbx-19mode
13
+ gemfile:
14
+ - gemfiles/rails_32.gemfile
15
+ - gemfiles/rails_40.gemfile
data/README.rdoc CHANGED
@@ -1,11 +1,11 @@
1
1
  = ActionArgs
2
2
 
3
- Controller action arguments parameterizer for Rails 3 + Ruby 1.9
3
+ Controller action arguments parameterizer for Rails 3+
4
4
 
5
5
 
6
6
  == What is this?
7
7
 
8
- ActionArgs is a Rails 3 plugin that extends your controller action methods to look and act like simple general Ruby methods with meaningful parameters, or in short, Merbish.
8
+ ActionArgs is a Rails plugin that extends your controller action methods to look and act like simple general Ruby methods with meaningful parameters, or in short, Merbish.
9
9
 
10
10
 
11
11
  == The Controllers
@@ -19,12 +19,39 @@ Having the following controller code:
19
19
  end
20
20
 
21
21
  Hitting "/hoge/fuga?piyo=foo" will call fuga('foo') and output 'foo'.
22
- So, you do never need to touch the ugly +params+ Hash to get the request parameters.
22
+ So, you do never need to touch the ugly +params+ Hash in order to fetch the request parameters.
23
+
24
+
25
+ == StrongParameters
26
+
27
+ ActionArgs plays very nice with Rails 4 StrongParameters.
28
+ Hashes in the action method arguments simply responds to the `permit` method.
29
+
30
+ class UsersController < ApplicationController
31
+ def create(user)
32
+ @user = User.new(user.permit(:name, :age))
33
+ ...
34
+ end
35
+ end
36
+
37
+ Moreover, ActionArgs provides declarative `permits` method for controller classes,
38
+ so that you can DRY up your `permit` calls in the most comprehensible way.
39
+ The `permits` method assumes the model class from the controller name, and
40
+ `permit`s the action arguments containing attributes for that model.
41
+
42
+ class UsersController < ApplicationController
43
+ # white-lists User model's attributes
44
+ permits :name, :age
45
+
46
+ # the given `user` parameter would be automatically permitted by ActionArgs
47
+ def create(user)
48
+ @user = User.new(user)
49
+ end
50
+ end
23
51
 
24
52
 
25
53
  == The Scaffold Generator
26
54
 
27
- To tell you the truth, Rails 3 is originally designed to be able to very easily add this functionality (because Carlhuda did the work on this), so perhaps the most characteristic feature of this plugin is the generator.
28
55
  ActionArgs provides a custom scaffold controller generator that overwrites the default scaffold generator.
29
56
  Thus, by hitting the following command:
30
57
 
@@ -35,6 +62,8 @@ The following beautiful controller code will be generated:
35
62
  # coding: utf-8
36
63
 
37
64
  class UsersController < ApplicationController
65
+ permits :name, :age, :email
66
+
38
67
  # GET /users
39
68
  def index
40
69
  @users = User.all
@@ -94,9 +123,9 @@ You may notice that
94
123
 
95
124
  == Supported versions
96
125
 
97
- * Ruby 1.9.2, 1.9.3 (trunk)
126
+ * Ruby 1.9.2, 1.9.3, 2.0.0 (trunk)
98
127
 
99
- * Rails 3.0.x, 3.1 (edge)
128
+ * Rails 3.0.x, 3.1.x, 3.2.x, 4.0 (edge)
100
129
 
101
130
 
102
131
  == Installation
@@ -135,15 +164,9 @@ Each action method parameter name corresponds to +params+ key name. For example,
135
164
 
136
165
  == Todo
137
166
 
138
- * specs
139
167
  * other Ruby implementations
140
168
 
141
169
 
142
- == Conclusion
143
-
144
- Ruby 1.9 on Rails 3 FTW!
145
-
146
-
147
170
  == Copyright
148
171
 
149
172
  Copyright (c) 2011 Asakusa.rb. See MIT-LICENSE for further details.
data/Rakefile CHANGED
@@ -1,2 +1,29 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core'
5
+ require 'rspec/core/rake_task'
6
+
7
+ RSpec::Core::RakeTask.new(:spec) do |spec|
8
+ spec.pattern = FileList['spec/**/*_spec.rb']
9
+ end
10
+
11
+ task :default => 'spec:all'
12
+
13
+ namespace :spec do
14
+ %w(rails_32 rails_40).each do |gemfile|
15
+ desc "Run Tests against #{gemfile}"
16
+ task gemfile do
17
+ sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle --quiet"
18
+ sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle exec rake -t spec"
19
+ end
20
+ end
21
+
22
+ desc 'Run Tests against all ORMs'
23
+ task :all do
24
+ %w(rails_32 rails_40).each do |gemfile|
25
+ sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle --quiet"
26
+ sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle exec rake spec"
27
+ end
28
+ end
29
+ end
data/action_args.gemspec CHANGED
@@ -9,8 +9,8 @@ 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'
13
- s.description = 'Rails 3 plugin gem that supports Merbish style controller action arguments.'
12
+ s.summary = 'Controller action arguments parameterizer for Rails 3+ & Ruby 1.9+'
13
+ s.description = 'Rails plugin gem that supports Merbish style controller action arguments.'
14
14
 
15
15
  s.rubyforge_project = 'action_args'
16
16
 
@@ -18,4 +18,6 @@ Gem::Specification.new do |s|
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
+
22
+ s.add_development_dependency 'sqlite3', ['>= 0']
21
23
  end
@@ -0,0 +1,6 @@
1
+ source :rubygems
2
+
3
+ gem 'rails', '>= 3.2.9'
4
+ gem 'rspec-rails', '>= 2.0'
5
+
6
+ gemspec :path => '../'
@@ -0,0 +1,8 @@
1
+ source :rubygems
2
+
3
+ gem 'rails', github: 'rails/rails'
4
+ gem 'activerecord-deprecated_finders', github: 'rails/activerecord-deprecated_finders'
5
+ gem 'journey', github: 'rails/journey'
6
+ gem 'rspec-rails', '>= 2.0'
7
+
8
+ gemspec :path => '../'
data/lib/action_args.rb CHANGED
@@ -1,4 +1,8 @@
1
- require File.join(File.dirname(__FILE__), 'action_args/abstract_controller')
1
+ require 'action_args/abstract_controller'
2
+ begin
3
+ require 'strong_parameters'
4
+ rescue LoadError
5
+ end
2
6
 
3
7
  module ActionArgs
4
8
  class Railtie < ::Rails::Railtie
@@ -3,8 +3,36 @@ module AbstractController
3
3
  def send_action(method_name, *args)
4
4
  return send method_name, *args unless args.blank?
5
5
 
6
- values = method(method_name).parameters.map(&:last).map {|k| params[k]}
6
+ values = if defined? ActionController::StrongParameters
7
+ target_model_name = self.class.name.sub(/Controller$/, '').singularize.underscore.to_sym
8
+ permitted_attributes = self.class.instance_variable_get '@permitted_attributes'
9
+ method(method_name).parameters.reject {|kind, _| kind == :block }.map(&:last).map do |k|
10
+ if (k == target_model_name) && permitted_attributes
11
+ params.require(k).permit(*permitted_attributes)
12
+ else
13
+ params.require(k)
14
+ end
15
+ end
16
+ else
17
+ method(method_name).parameters.reject {|kind, _| kind == :block }.map(&:last).map {|k| params[k]}
18
+ end
7
19
  send method_name, *values
8
20
  end
21
+
22
+ # You can configure StrongParameters' `permit` attributes using this DSL method.
23
+ # The `permit` call will be invoked only against parameters having the resource
24
+ # model name inferred from the controller class name.
25
+ #
26
+ # class UsersController < ApplicationController
27
+ # permits :name, :age
28
+ #
29
+ # def create(user)
30
+ # @user = User.new(user)
31
+ # end
32
+ # end
33
+ #
34
+ def self.permits(*attributes)
35
+ @permitted_attributes = attributes
36
+ end
9
37
  end
10
38
  end
@@ -1,3 +1,3 @@
1
1
  module ActionArgs
2
- VERSION = '0.0.3'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -5,6 +5,7 @@ require 'rails/generators/rails/scaffold_controller/scaffold_controller_generato
5
5
  module Rails
6
6
  module Generators
7
7
  class ActionArgsScaffoldControllerGenerator < ::Rails::Generators::ScaffoldControllerGenerator
8
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
8
9
  source_root File.expand_path('../templates', __FILE__)
9
10
  end
10
11
  end
@@ -1,6 +1,10 @@
1
1
  # coding: utf-8
2
2
 
3
3
  class <%= controller_class_name %>Controller < ApplicationController
4
+ <% if defined? ActionController::StrongParameters -%>
5
+ permits <%= attributes.map {|a| ":#{a.name}" }.join(', ') %>
6
+
7
+ <% end -%>
4
8
  # GET <%= route_url %>
5
9
  def index
6
10
  @<%= plural_table_name %> = <%= orm_class.all(class_name) %>
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe BooksController do
4
+ describe 'GET show' do
5
+ let(:rhg) { Book.create! title: 'RHG' }
6
+ before { get :show, :id => rhg.id }
7
+ subject { assigns :book }
8
+ it { should == rhg }
9
+ end
10
+
11
+ describe 'POST create' do
12
+ let(:rhg) { Book.create! title: 'RHG' }
13
+ it { expect { post :create, :book => {title: 'AWDwR', price: 24} }.to change(Book, :count).by(1) }
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe AuthorsController do
4
+ describe 'GET show' do
5
+ let(:matz) { Author.create! name: 'Matz' }
6
+ it 'assigns the requested author as @author' do
7
+ get :show, :id => matz.id
8
+ assigns(:author).should eq(matz)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ if Rails::VERSION::MAJOR >= 4
4
+ describe StoresController do
5
+ describe 'GET show' do
6
+ let(:tatsu_zine) { Store.create! name: 'Tatsu-zine' }
7
+ before { get :show, :id => tatsu_zine.id }
8
+ subject { assigns :store }
9
+ it { should == tatsu_zine }
10
+ end
11
+
12
+ describe 'POST create' do
13
+ it { expect { post :create, :store => {name: 'Tatsu-zine', url: 'http://tatsu-zine.com'} }.to change(Store, :count).by(1) }
14
+ end
15
+ end
16
+ end
data/spec/fake_app.rb ADDED
@@ -0,0 +1,76 @@
1
+ # config
2
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
3
+
4
+ module ActionArgsTestApp
5
+ class Application < Rails::Application
6
+ config.secret_token = [*'A'..'z'].join
7
+ config.session_store :cookie_store, :key => '_myapp_session'
8
+ config.active_support.deprecation = :log
9
+ config.eager_load = false
10
+ end
11
+ end
12
+ ActionArgsTestApp::Application.initialize!
13
+
14
+ # routes
15
+ ActionArgsTestApp::Application.routes.draw do
16
+ resources :authors
17
+ resources :books
18
+ resources :stores
19
+ end
20
+
21
+ # models
22
+ class Author < ActiveRecord::Base
23
+ end
24
+ class Book < ActiveRecord::Base
25
+ end
26
+ class Store < ActiveRecord::Base
27
+ end
28
+
29
+ # helpers
30
+ module ApplicationHelper; end
31
+
32
+ # controllers
33
+ class ApplicationController < ActionController::Base
34
+ end
35
+ class AuthorsController < ApplicationController
36
+ def show
37
+ @author = Author.find params[:id]
38
+ render text: @author.name
39
+ end
40
+ end
41
+ class BooksController < ApplicationController
42
+ def show(id)
43
+ @book = Book.find(id)
44
+ render text: @book.title
45
+ end
46
+
47
+ def create(book)
48
+ book = book.permit :title, :price if Rails::VERSION::MAJOR >= 4
49
+ @book = Book.create! book
50
+ render text: @book.title
51
+ end
52
+ end
53
+ if Rails::VERSION::MAJOR >= 4
54
+ class StoresController < ApplicationController
55
+ permits :name, :url
56
+
57
+ def show(id)
58
+ @store = Store.find(id)
59
+ render text: @store.name
60
+ end
61
+
62
+ def create(store)
63
+ @store = Store.create! store
64
+ render text: @store.name
65
+ end
66
+ end
67
+ end
68
+
69
+ # migrations
70
+ class CreateAllTables < ActiveRecord::Migration
71
+ def self.up
72
+ create_table(:authors) {|t| t.string :name}
73
+ create_table(:books) {|t| t.string :title; t.integer :price}
74
+ create_table(:stores) {|t| t.string :name; t.string :url}
75
+ end
76
+ end
@@ -0,0 +1,15 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ # load Rails first
4
+ require 'rails'
5
+ require 'active_record'
6
+ require 'action_controller/railtie'
7
+ require 'action_args'
8
+ require 'fake_app'
9
+ require 'rspec/rails'
10
+
11
+ RSpec.configure do |config|
12
+ config.before :all do
13
+ CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? 'authors'
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_args
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,9 +9,25 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-29 00:00:00.000000000 Z
13
- dependencies: []
14
- description: Rails 3 plugin gem that supports Merbish style controller action arguments.
12
+ date: 2012-11-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sqlite3
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: Rails plugin gem that supports Merbish style controller action arguments.
15
31
  email:
16
32
  - ronnie@dio.jp
17
33
  executables: []
@@ -19,11 +35,14 @@ extensions: []
19
35
  extra_rdoc_files: []
20
36
  files:
21
37
  - .gitignore
38
+ - .travis.yml
22
39
  - Gemfile
23
40
  - MIT-LICENSE
24
41
  - README.rdoc
25
42
  - Rakefile
26
43
  - action_args.gemspec
44
+ - gemfiles/rails_32.gemfile
45
+ - gemfiles/rails_40.gemfile
27
46
  - lib/action_args.rb
28
47
  - lib/action_args/abstract_controller.rb
29
48
  - lib/action_args/version.rb
@@ -31,6 +50,11 @@ files:
31
50
  - lib/generators/action_args/rspec/scaffold/templates/action_args_controller_spec.rb
32
51
  - lib/generators/rails/action_args_scaffold_controller_generator.rb
33
52
  - lib/generators/rails/templates/controller.rb
53
+ - spec/controllers/action_args_controller_spec.rb
54
+ - spec/controllers/ordinal_controller_spec.rb
55
+ - spec/controllers/strong_parameters_spec.rb
56
+ - spec/fake_app.rb
57
+ - spec/spec_helper.rb
34
58
  homepage: http://asakusa.rubyist.net/
35
59
  licenses: []
36
60
  post_install_message:
@@ -51,8 +75,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
51
75
  version: '0'
52
76
  requirements: []
53
77
  rubyforge_project: action_args
54
- rubygems_version: 1.8.17
78
+ rubygems_version: 1.8.24
55
79
  signing_key:
56
80
  specification_version: 3
57
- summary: Controller action arguments parameterizer for Rails 3 + Ruby 1.9
58
- test_files: []
81
+ summary: Controller action arguments parameterizer for Rails 3+ & Ruby 1.9+
82
+ test_files:
83
+ - spec/controllers/action_args_controller_spec.rb
84
+ - spec/controllers/ordinal_controller_spec.rb
85
+ - spec/controllers/strong_parameters_spec.rb
86
+ - spec/fake_app.rb
87
+ - spec/spec_helper.rb