indmill-finder_filter 0.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,3 @@
1
+ 8/9/08 - Defaulting class name to controller name. [Kevin Smith]
2
+
3
+ 8/8/08 - Initial import. [Matthew Bass]
data/README ADDED
@@ -0,0 +1,87 @@
1
+ = Synthesis
2
+
3
+ An easy way to add common finders to your Rails controllers.
4
+
5
+ == Installation
6
+
7
+ gem sources -a http://gems.github.com (you only have to do this once)
8
+ sudo gem install pelargir-finder_filter
9
+
10
+ To use with a Rails 2.1 app, edit the environment.rb file and add an
11
+ entry for the gem to the Rails::Initializer config block.
12
+
13
+ == Usage
14
+
15
+ finder_filter is intended to replace one-off before filters that you might
16
+ commonly write in your Rails controllers. For example:
17
+
18
+ class UsersController < ActionController::Base
19
+ before_filter :find_user, :only => [:show, :edit]
20
+
21
+ def show
22
+ # do something with @user
23
+ end
24
+
25
+ def edit
26
+ # do something with @user
27
+ end
28
+
29
+ def find_user
30
+ @user = User.find(params[:id)
31
+ end
32
+ end
33
+
34
+ finder_filter reduces this pattern to a single line:
35
+
36
+ class UsersController < ActionController::Base
37
+ finder_filter :only => [:show, :edit]
38
+
39
+ def show; end
40
+ def edit; end
41
+ end
42
+
43
+ Or, if you want to specify the model to find:
44
+
45
+ class UsersController < ActionController::Base
46
+ finder_filter :user, :only => [:show, :edit]
47
+
48
+ def show; end
49
+ def edit; end
50
+ end
51
+
52
+ To find based on a column other than ID:
53
+
54
+ finder_filter :user, :by => :name
55
+ # equivalent to:
56
+ # @user = User.find_by_name(params[:id])
57
+
58
+ To find based on a param other than ID:
59
+
60
+ finder_filter :user, :param => :permalink
61
+ # equivalent to:
62
+ # @user = User.find(params[:permalink])
63
+
64
+ The standard Rails :only and :except options can also be used:
65
+
66
+ before_filter :find_user, :only => [:show, :edit]
67
+ before_filter :find_user, :except => [:index]
68
+
69
+ == Tests
70
+
71
+ To run the tests:
72
+
73
+ rake test
74
+
75
+ == Dependencies
76
+
77
+ actionpack > 2.0.1
78
+ mocha > 0.5.6
79
+ test-spec > 0.4.0
80
+
81
+ == Git
82
+
83
+ git://github.com/pelargir/finder_filter.git
84
+
85
+ == Contributors
86
+
87
+ Matthew Bass, Kevin Smith
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ task :default => :test
6
+
7
+ Rake::TestTask.new('test') do |t|
8
+ t.pattern = 'test/*_test.rb'
9
+ end
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "finder_filter"
3
+ s.version = "0.5"
4
+ s.date = "2008-08-14"
5
+ s.summary = "An easy way to add common finders to your Rails controllers."
6
+ s.email = "pelargir@gmail.com"
7
+ s.homepage = "http://github.com/pelargir/finder_filter"
8
+ s.description = "An easy way to add common finders to your Rails controllers."
9
+ s.has_rdoc = true
10
+ s.authors = ["Matthew Bass"]
11
+ s.files = [
12
+ "CHANGELOG",
13
+ "README",
14
+ "Rakefile",
15
+ "finder_filter.gemspec",
16
+ "lib/finder_filter.rb",
17
+ "test/test_helper.rb",
18
+ "test/finder_filter_test.rb"
19
+ ]
20
+ s.rdoc_options = ["--main", "README"]
21
+ s.extra_rdoc_files = ["README"]
22
+ s.add_dependency("actionpack", ["> 2.0.1"])
23
+ s.add_dependency("mocha", ["> 0.5.6"])
24
+ s.add_dependency("test-spec", ["> 0.4.0"])
25
+ end
@@ -0,0 +1,19 @@
1
+ module FinderFilter
2
+ def finder_filter(*args)
3
+ options = args.extract_options!
4
+ name = args.empty? ? controller_name.singularize : args.first
5
+ by = options.delete(:by)
6
+ param = options.delete(:param) || :id
7
+ prepend = options.delete(:prepend) || false
8
+
9
+ send(prepend ? :prepend_before_filter : :before_filter, :"find_#{name}", options)
10
+
11
+ define_method "find_#{name}" do
12
+ klass = name.to_s.classify.constantize
13
+ item = by ? klass.send("find_by_#{by}", params[param]) : klass.find(params[param])
14
+ instance_variable_set("@#{name}", item)
15
+ end
16
+ end
17
+ end
18
+
19
+ ActionController::Base.extend FinderFilter
@@ -0,0 +1,70 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class TestController < ActionController::Base; extend FinderFilter; end
4
+ class TestsController < ActionController::Base; extend FinderFilter; end
5
+
6
+ describe FinderFilter do
7
+ before { @controller = TestController }
8
+
9
+ it "should assign before filter when model specified" do
10
+ @controller.expects(:before_filter).with(:"find_foo", {})
11
+ @controller.finder_filter :foo
12
+ end
13
+
14
+ it "should assign before filter when model not specified" do
15
+ @controller.expects(:before_filter).with(:"find_test", {})
16
+ @controller.finder_filter
17
+ end
18
+
19
+ it "should assign before filter when model not specified and controller name is plural" do
20
+ controller = TestsController
21
+ controller.expects(:before_filter).with(:"find_test", {})
22
+ controller.finder_filter
23
+ end
24
+
25
+ it "should assign before filter when options are specified" do
26
+ @controller.expects(:before_filter).with(:"find_test", {})
27
+ @controller.finder_filter :by => :permalink, :param => :name
28
+ end
29
+
30
+ it "should assign before filter with options" do
31
+ @controller.expects(:before_filter).with(:"find_test", :only => [:show, :edit])
32
+ @controller.finder_filter :only => [:show, :edit]
33
+ end
34
+
35
+ it "should assign prepend before filter when prepend option specified" do
36
+ @controller.expects(:prepend_before_filter).with(:"find_test", {})
37
+ @controller.finder_filter :prepend => true
38
+ end
39
+
40
+ it "should assign prepend before filter when prepend option specified with only option" do
41
+ @controller.expects(:prepend_before_filter).with(:"find_test", :only => [:show, :edit])
42
+ @controller.finder_filter :only => [:show, :edit], :prepend => true
43
+ end
44
+
45
+ it "should assign prepend before filter when prepend option specified with multiple options" do
46
+ @controller.expects(:prepend_before_filter).with(:"find_test", :only => [:show, :edit])
47
+ @controller.finder_filter :only => [:show, :edit], :prepend => true, :by => "name"
48
+ end
49
+
50
+ it "should define method when model specified" do
51
+ @controller.expects(:define_method).with("find_foo")
52
+ @controller.finder_filter :foo
53
+ end
54
+
55
+ it "should define method when model not specified" do
56
+ @controller.expects(:define_method).with("find_test")
57
+ @controller.finder_filter
58
+ end
59
+
60
+ it "should define method when model not specified and controller name is plural" do
61
+ controller = TestsController
62
+ controller.expects(:define_method).with("find_test")
63
+ controller.finder_filter
64
+ end
65
+
66
+ it "should define method when options are specified" do
67
+ @controller.expects(:define_method).with("find_test")
68
+ @controller.finder_filter :by => :permalink, :param => :name
69
+ end
70
+ end
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'test/spec'
3
+ require 'mocha'
4
+ require 'action_controller'
5
+
6
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/finder_filter')
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: indmill-finder_filter
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.5"
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Bass
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-08-14 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: actionpack
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">"
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.1
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: mocha
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">"
30
+ - !ruby/object:Gem::Version
31
+ version: 0.5.6
32
+ version:
33
+ - !ruby/object:Gem::Dependency
34
+ name: test-spec
35
+ version_requirement:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.4.0
41
+ version:
42
+ description: An easy way to add common finders to your Rails controllers.
43
+ email: pelargir@gmail.com
44
+ executables: []
45
+
46
+ extensions: []
47
+
48
+ extra_rdoc_files:
49
+ - README
50
+ files:
51
+ - CHANGELOG
52
+ - README
53
+ - Rakefile
54
+ - finder_filter.gemspec
55
+ - lib/finder_filter.rb
56
+ - test/test_helper.rb
57
+ - test/finder_filter_test.rb
58
+ has_rdoc: true
59
+ homepage: http://github.com/pelargir/finder_filter
60
+ post_install_message:
61
+ rdoc_options:
62
+ - --main
63
+ - README
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: "0"
71
+ version:
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: "0"
77
+ version:
78
+ requirements: []
79
+
80
+ rubyforge_project:
81
+ rubygems_version: 1.2.0
82
+ signing_key:
83
+ specification_version: 2
84
+ summary: An easy way to add common finders to your Rails controllers.
85
+ test_files: []
86
+