yfactorial-utility_scopes 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ 0.2.2
2
+
3
+ * More flexible @ordered@ syntax (by jney - http://github.com/jney)
4
+
1
5
  0.2.1
2
6
 
3
7
  * Fixed except named scope not correctly determining its base class
data/README.textile CHANGED
@@ -110,11 +110,17 @@ h3. Ordered
110
110
  _Note: the @ordered@ scope cannot be chained with any other @order@ clauses_
111
111
 
112
112
  @ordered@ lets you dynamically specify the ordering of your result set. If no
113
- arguments are given it will default to @created_at DESC@:
114
-
115
- Article.ordered # Get all articles ordered by "created_at DESC"
116
- Article.ordered(:id) # Get all articles ordered by "id"
117
- Article.ordered("rank ASC") # Get all articles ordered by "rank ASC"
113
+ arguments are given it will default to @created_at DESC@. (@ordered@ is also
114
+ available as @order_by@ and @sort_by@)
115
+
116
+ Article.ordered # Get all articles ordered by "created_at DESC"
117
+ Article.ordered(:id) # Get all articles ordered by "id"
118
+ Article.ordered("rank ASC") # Get all articles ordered by "rank ASC"
119
+ Article.order_by(:id) # order_by and sort_by are alias to ordered
120
+ Article.order_by([:id, :desc], :popularity) # can take a two-element array as parameter
121
+ Article.sort_by(:id => :desc, :popularity => :asc) # can take a hash as parameter
122
+ # only available for jruby/ruby 1.9
123
+ Article.order_by_id # can be set as a sentence
118
124
 
119
125
  If you would like to specify a different default sort order you can do so on a per class basis
120
126
  using @ordered_by@:
data/Rakefile CHANGED
@@ -1,8 +1,13 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
  require 'rake/rdoctask'
4
+ require 'spec/rake/spectask'
4
5
 
5
- # TODO add task to execute specs
6
+ desc 'Run the specs'
7
+ Spec::Rake::SpecTask.new(:spec) do |t|
8
+ t.spec_opts = ['--colour --format progress --loadby mtime --reverse']
9
+ t.spec_files = FileList['spec/**/*_spec.rb']
10
+ end
6
11
 
7
12
  desc 'Generate RDoc documentation.'
8
13
  Rake::RDocTask.new(:rdoc) do |rdoc|
@@ -2,20 +2,32 @@
2
2
  module UtilityScopes
3
3
  module Ordered
4
4
 
5
- def self.included(within)
6
- within.class_eval do
7
-
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+
8
+ base.class_eval do
8
9
  # Provide an ordered scope
9
- named_scope :ordered, lambda { |*order|
10
- { :order => order.flatten.first || self.default_ordering }
11
- }
10
+ named_scope(:ordered, lambda { |*order|
11
+ { :order => case
12
+ when order.empty?
13
+ self.default_ordering
14
+ # allow hash support for jruby or ruby 1.9
15
+ when order.size == 1 && order[0].is_a?(Hash) && (PLATFORM=~/java/ || RUBY_VERSION=~/1\.9.*/)
16
+ order.first.collect{|(k,v)| "#{k} #{v.to_s.upcase}"}.join(', ')
17
+ else
18
+ order.collect{|e| e.is_a?(Array) ? "#{e[0]} #{e[1].to_s.upcase}" : e}.join(', ')
19
+ end
20
+ }
21
+ })
12
22
 
13
- # Set the default order
14
23
  class << self
24
+ # Set alias order_by
25
+ alias_method :order_by, :ordered
26
+ # Set alias sort_by
27
+ alias_method :sort_by, :ordered
28
+ # Set the default order
15
29
  define_method(:default_ordering) { 'created_at DESC' }
16
30
  end
17
-
18
- extend ClassMethods
19
31
  end
20
32
  end
21
33
 
@@ -33,18 +45,35 @@ module UtilityScopes
33
45
  # Article.default_ordering #=> "published_at DESC"
34
46
  #
35
47
  def ordered_by(clause)
36
-
37
48
  # Override named scope on AR::Base so we can access default_ordering
38
49
  # on subclass
39
- named_scope :ordered, lambda { |*order|
40
- { :order => order.flatten.first || self.default_ordering }
41
- }
50
+ named_scope(:ordered, lambda { |*order|
51
+ { :order => case
52
+ when order.empty?
53
+ self.default_ordering
54
+ # allow hash support for jruby or ruby 1.9
55
+ when order.size == 1 && order[0].is_a?(Hash) && (PLATFORM=~/java/ || RUBY_VERSION=~/1\.9.*/)
56
+ order.first.collect{|(k,v)| "#{k} #{v.to_s.upcase}"}.join(', ')
57
+ else
58
+ order.collect{|e| e.is_a?(Array) ? "#{e[0]} #{e[1].to_s.upcase}" : e}.join(', ')
59
+ end
60
+ }
61
+ })
42
62
 
43
63
  metaclass.instance_eval do
44
64
  define_method(:default_ordering) { clause }
45
65
  end
46
66
  end
47
67
 
68
+ def method_missing(method, *args, &block)
69
+ col = method.to_s.match(/^(order_by_|sort_by_)(.*)$/)[2] rescue false
70
+ if col && self.columns.collect{ |c| c.name }.include?(col)
71
+ return self.order_by(col, *args, &block)
72
+ else
73
+ super
74
+ end
75
+ end
76
+
48
77
  private
49
78
 
50
79
  def metaclass; class << self; self end; end
data/spec/ordered_spec.rb CHANGED
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), *%w[abstract_spec])
2
2
 
3
3
  describe "Ordered scope" do
4
4
 
5
- before do
5
+ before(:each) do
6
6
  uses_fixture(:article)
7
7
  end
8
8
 
@@ -15,6 +15,38 @@ describe "Ordered scope" do
15
15
  Article.ordered('created_at ASC').proxy_options.should == {:order => 'created_at ASC'}
16
16
  end
17
17
 
18
+ it "should allow the order to use arrays as arg" do
19
+ Article.ordered([:popularity, :asc], [:second_param, :desc]).proxy_options.should == {:order => 'popularity ASC, second_param DESC'}
20
+ end
21
+
22
+ it "should allow the order hash as arg" do
23
+ if (PLATFORM=~/java/ || RUBY_VERSION=~/1\.9.*/)
24
+ Article.ordered(:popularity => :asc, :second_param => :desc).proxy_options.should == {:order => 'popularity ASC, second_param DESC'}
25
+ end
26
+ end
27
+
28
+ it "should allow the order with several args" do
29
+ Article.ordered(:popularity, :updated_at).proxy_options.should == {:order => 'popularity, updated_at'}
30
+ end
31
+
32
+ it "should sort by column popularity when calling order_by_popularity" do
33
+ require 'ostruct'
34
+ columns = [OpenStruct.new({:name => 'popularity'})]
35
+ Article.stub!(:columns).and_return(columns)
36
+ Article.order_by_popularity.proxy_options.should == {:order => 'popularity'}
37
+ end
38
+
39
+ it "should raise an error when column does not exist" do
40
+ require 'ostruct'
41
+ columns = [OpenStruct.new({:name => 'popularity'})]
42
+ Article.stub!(:columns).and_return(columns)
43
+ lambda{ Article.order_by_unknown_columns }.should raise_error
44
+ end
45
+
46
+ it "should have an alias" do
47
+ Article.order_by([:popularity, :asc]).proxy_options.should == {:order => 'popularity ASC'}
48
+ end
49
+
18
50
  it "should allow the default to be overidden by using ordered_by" do
19
51
  Article.ordered_by 'published_at DESC'
20
52
  Article.default_ordering.should == 'published_at DESC'
@@ -27,6 +59,6 @@ describe "Ordered scope" do
27
59
  end
28
60
 
29
61
  it "should be able to handle symbol order criteria" do
30
- Article.ordered(:id).proxy_options.should == { :order => :id }
62
+ Article.ordered(:id).proxy_options.should == { :order => 'id' }
31
63
  end
32
64
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'rubygems'
2
2
  require 'spec'
3
-
3
+
4
4
  Spec::Runner.configure do |config|
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yfactorial-utility_scopes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Daigle
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-09-08 00:00:00 -07:00
12
+ date: 2008-10-28 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency