finder_filter 0.5

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.
@@ -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, you must have the mocha and test-spec gems installed.
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
@@ -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,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "finder_filter"
3
+ s.version = "0.5"
4
+ s.date = "2008-08-08"
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
+ end
@@ -0,0 +1,18 @@
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
+
8
+ before_filter "find_#{name}", options
9
+
10
+ define_method "find_#{name}" do
11
+ klass = name.to_s.classify.constantize
12
+ item = by ? klass.send("find_by_#{by}", params[param]) : klass.find(params[param])
13
+ instance_variable_set("@#{name}", item)
14
+ end
15
+ end
16
+ end
17
+
18
+ ActionController::Base.extend FinderFilter
@@ -0,0 +1,55 @@
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 define method when model specified" do
36
+ @controller.expects(:define_method).with("find_foo")
37
+ @controller.finder_filter :foo
38
+ end
39
+
40
+ it "should define method when model not specified" do
41
+ @controller.expects(:define_method).with("find_test")
42
+ @controller.finder_filter
43
+ end
44
+
45
+ it "should define method when model not specified and controller name is plural" do
46
+ controller = TestsController
47
+ controller.expects(:define_method).with("find_test")
48
+ controller.finder_filter
49
+ end
50
+
51
+ it "should define method when options are specified" do
52
+ @controller.expects(:define_method).with("find_test")
53
+ @controller.finder_filter :by => :permalink, :param => :name
54
+ end
55
+ 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,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: 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-08 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: actionpack
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 2.0.1
24
+ version:
25
+ description: An easy way to add common finders to your Rails controllers.
26
+ email: pelargir@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README
33
+ files:
34
+ - CHANGELOG
35
+ - README
36
+ - Rakefile
37
+ - finder_filter.gemspec
38
+ - lib/finder_filter.rb
39
+ - test/test_helper.rb
40
+ - test/finder_filter_test.rb
41
+ has_rdoc: true
42
+ homepage: http://github.com/pelargir/finder_filter
43
+ post_install_message:
44
+ rdoc_options:
45
+ - --main
46
+ - README
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ requirements: []
62
+
63
+ rubyforge_project:
64
+ rubygems_version: 1.2.0
65
+ signing_key:
66
+ specification_version: 2
67
+ summary: An easy way to add common finders to your Rails controllers.
68
+ test_files: []
69
+