indmill-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.
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
+