refined 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,72 @@
1
+ `refined` is a technique for chaining scopes (or class methods as it were. see (http://elabs.se/blog/24-scopes-are-obsolete/ "Scopes Are Obsolete") to faciliate easy filtering of ActiveRecord collections.
2
+
3
+ Installation
4
+ ============
5
+
6
+ gem install refined
7
+
8
+ ### When used with Rails 3
9
+
10
+ in a `Gemfile`:
11
+
12
+ gem 'refined'
13
+
14
+ Example Use
15
+ ===========
16
+
17
+ ### A Simple Scenario
18
+
19
+ Let's say you want to filter a list of candidates for hire by status and skill level. The code might look something like this.
20
+
21
+ class Candidate < ActiveRecord::Base; end
22
+
23
+ controller Candidates < ApplicationController
24
+ expose(:candidates) { Candidate.refined(params[:filters] }
25
+
26
+ def filter
27
+ render :index
28
+ end
29
+ end
30
+
31
+ = form_for :filters, url: filter_candidates_url do |f|
32
+ %fieldset
33
+ %dl
34
+ %dt Status
35
+ %dd= f.select :status, ["pending", "hired", "rejected"]
36
+
37
+ %dt Skill
38
+ %dd= f.select :skill, ["beginner", "intermediate", "advanced"]
39
+ %fieldset.action
40
+ = f.submit "Filter"
41
+
42
+ %table
43
+ %thead
44
+ %tr
45
+ - ["Name", "Status", "Skill"].each do |header|
46
+ %th header
47
+ %tbody
48
+ - candidates.each do |candidate|
49
+ %tr
50
+ %td= candidate.name
51
+ %td= candidate.status
52
+ %td= candidate.skill
53
+
54
+ The call to Candidate.refined(params[:filters]) will yield 2 class methods created on Candidate as such:
55
+
56
+ def self.status(arg)
57
+ where(status: arg)
58
+ end
59
+
60
+ def self.skill(arg)
61
+ where(skill: arg)
62
+ end
63
+
64
+ And will chain those methods as `Candidate.status("pending").skill("advanced")` returning the scoped collection of candidates.
65
+
66
+ ### TODO
67
+
68
+ - Rails 2 support
69
+ - Ruby 1.8 support
70
+ - Multiple parameters
71
+ - More AREL finder methods
72
+ - Accessor methods for parameter values
data/lib/refined.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "refined/railtie"
2
+
3
+ module Refined
4
+ autoload :ScopeChain, "refined/scope_chain"
5
+ autoload :Railtie, "refined/railtie"
6
+
7
+ def refined(criteria)
8
+ Refined::ScopeChain.new(self.to_s, criteria).chain!
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ module Refined
2
+ if defined? Rails::Railtie
3
+ class Railtie < Rails::Railtie
4
+ initializer "refined.extend_active_record_base" do |app|
5
+ ActiveSupport.on_load(:active_record) do
6
+ Refined::Railtie.insert
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ class Railtie
13
+ def self.insert
14
+ ActiveRecord::Base.extend(Refined)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ class Refined::ScopeChain
2
+ attr_accessor :criteria
3
+ attr_reader :constant_name
4
+
5
+ def initialize(name, criteria={})
6
+ self.constant_name = name
7
+ self.criteria = criteria
8
+ end
9
+
10
+ def constant_name=(name)
11
+ @constant_name ||= name.constantize
12
+ end
13
+
14
+ def construct(name, value)
15
+ constant_name.send :define_singleton_method, name do |arg|
16
+ where(name => value)
17
+ end unless constant_name.respond_to?(name)
18
+ end
19
+
20
+ def chain!
21
+ criteria.inject(constant_name) do |model, (method, arg)|
22
+ construct(method, arg)
23
+ model.send(method, arg)
24
+ end
25
+ end
26
+
27
+ end
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: refined
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Dave Ott
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-01 00:00:00 -04:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: activerecord
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :development
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: "0"
36
+ type: :development
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: rspec
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: ruby-debug19
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: sqlite3-ruby
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ type: :development
70
+ version_requirements: *id005
71
+ description: Refined scopes ActiveRecord collections automagicaly.
72
+ email: daveott@daveott.net
73
+ executables: []
74
+
75
+ extensions: []
76
+
77
+ extra_rdoc_files: []
78
+
79
+ files:
80
+ - lib/refined/railtie.rb
81
+ - lib/refined/scope_chain.rb
82
+ - lib/refined.rb
83
+ - README.md
84
+ has_rdoc: true
85
+ homepage: http://rubygems.org/gems/refined
86
+ licenses: []
87
+
88
+ post_install_message:
89
+ rdoc_options:
90
+ - --charset=UTF-8
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: "0"
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: "0"
105
+ requirements: []
106
+
107
+ rubyforge_project:
108
+ rubygems_version: 1.5.2
109
+ signing_key:
110
+ specification_version: 3
111
+ summary: Refined!
112
+ test_files: []
113
+