refined 0.0.1

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/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
+