sorted 0.3.9 → 0.4.0

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.
@@ -5,105 +5,18 @@ sort string to let you sort large datasets over many pages (using
5
5
  {will_paginate}[http://github.com/mislav/will_paginatea] or
6
6
  {kaminari}[https://github.com/amatsuda/kaminari]) without loosing state.
7
7
 
8
- If you would like to see it in action clone the
9
- {example app}[https://github.com/mynameisrufus/sorted_app]
10
-
11
8
  === Gemfile
12
9
 
13
- gem 'sorted' '~> 0.3.9'
10
+ gem 'sorted', '~> 0.4.0'
14
11
 
15
12
  === View
16
13
 
17
- link_to_sorted "Email", :email
18
-
19
- This will generate a link with a url like this:
20
-
21
- http://myapp/users?sort=email_asc
14
+ Generate a sorted link with the email attribute:
22
15
 
23
- and on the next page load when you then sort by something else....
24
-
25
- http://myapp/users?sort=name_asc!email_asc
16
+ link_to_sorted "Email", :email
26
17
 
27
18
  === Model
28
19
 
29
- This will initially sort by email ascending with the optional second
30
- default order argument:
31
-
32
- @users = User.sort(params[:sort], "email ASC").page(params[:page])
33
-
34
- ==== Joins and includes
35
-
36
- If you want to sort by a belongs to relationship add the table name to
37
- the order argument. For example assuming a user belongs to a company:
38
-
39
- @users = User.joins(:company).sort(params[:sort], "companies.name ASC").page(params[:page])
40
-
41
- When generating links using the +link_to_sorted+ method you should
42
- specify the table for every attribute you use as well otherwise you
43
- will probably get an ambiguous column name error.
44
-
45
- <th class="ui-state-default"><%= link_to_sorted "Company name", 'companies.name' %></th>
46
- <th class="ui-state-default"><%= link_to_sorted "Users name", 'users.name' %></th>
47
-
48
- ==== Typecasting and DB functions
49
-
50
- Do your type casting and function calls in your select statement with an
51
- alias, for example:
52
-
53
- # controller
54
- @users = User.select("income::BigInt as bg_income").sort(params[:sort], "bg_income ASC")
55
-
56
- # view
57
- <th class="ui-state-default"><%= link_to_sorted "Income", 'bg_income' %></th>
58
-
59
- or using a DB function:
60
-
61
- # controller
62
- @users = User.select("inet_aton(`ip_address`) AS in_ip").sort(params[:sort], "in_ip ASC")
63
-
64
- # view
65
- <th class="ui-state-default"><%= link_to_sorted "IP address", 'in_ip' %></th>
66
-
67
- == Presentation
68
-
69
- You might want to roll your own +link_to_sorted+ method to use jQuery ui
70
- css classes for example, all you need is the sorted object.
71
-
72
- def link_to_sorted(name, order)
73
- dup_params = (request.get? && !params.nil?) ? params.dup : nil
74
- sorter = ActionView::Base::SortedViewHelper.new(order, dup_params)
75
- css_class = case sorter.css
76
- when "sorted asc"
77
- "ui-icon ui-icon-triangle-1-n"
78
- when "sorted desc"
79
- "ui-icon ui-icon-triangle-1-s"
80
- when "sorted"
81
- "ui-icon ui-icon-carat-2-n-s"
82
- end
83
- link_to(content_tag(:span, nil, {:class => css_class}) + name.to_s, sorter.params)
84
- end
85
-
86
- Tables are best displayed with alternating shades for each row, so add
87
- an alternating class to you table rows using the rails +cycle+ method:
88
-
89
- <tr class="<%= cycle 'odd', 'even' %>">
90
-
91
- == Rails 2.3.x
92
-
93
- Sorted works with rails 2.3.x but you will have to roll your own scope
94
- and view helper.
95
-
96
- Here is the named scope for your model(s):
97
-
98
- named_scope :sort, lambda { |sort, order|
99
- { :order => Sorted::Parser.new(sort, order).to_sql }
100
- }
101
-
102
- and the application helper method:
20
+ Using the +sort+ method with the optional default order argument:
103
21
 
104
- def link_to_sorted(name, order, options = {})
105
- dup_params = (request.get? && !params.nil?) ? params.dup : nil
106
- sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new(order, dup_params)
107
- options[:class] = [options[:class], sorter.css].join(' ').strip
108
- link_to(name.to_s, sorter.params, options)
109
- end
22
+ @users = User.sorted(params[:sort], "email ASC").page(params[:page])
@@ -4,12 +4,10 @@ require 'sorted'
4
4
  module Sorted
5
5
  module Orms
6
6
  module ActiveRecord
7
- def self.enable!
8
- ::ActiveRecord::Base.class_eval do
9
- def self.sort(sort, order = nil)
10
- sorter = ::Sorted::Parser.new(sort, order)
11
- order sorter.to_sql
12
- end
7
+ def self.included(base)
8
+ def base.sorted(sort, default_order = nil)
9
+ sorter = ::Sorted::Parser.new(sort, default_order)
10
+ order sorter.to_sql
13
11
  end
14
12
  end
15
13
  end
@@ -2,16 +2,18 @@ require 'sorted'
2
2
 
3
3
  module Sorted
4
4
  class Railtie < Rails::Railtie
5
- initializer "sorted.active_record" do |app|
6
- if defined? ::ActiveRecord
5
+ if defined? ::ActiveRecord
6
+ initializer "sorted.active_record" do |app|
7
7
  require 'sorted/orms/active_record'
8
- Sorted::Orms::ActiveRecord.enable!
8
+ ::ActiveRecord::Base.send(:include, Sorted::Orms::ActiveRecord)
9
9
  end
10
10
  end
11
11
 
12
- initializer "sorted.action_view" do |app|
13
- require 'sorted/view_helpers/action_view'
14
- ::ActionView::Base.send(:include, Sorted::ViewHelpers::ActionView)
12
+ if defined? ::ActiveRecord
13
+ initializer "sorted.action_view" do |app|
14
+ require 'sorted/view_helpers/action_view'
15
+ ::ActionView::Base.send(:include, Sorted::ViewHelpers::ActionView)
16
+ end
15
17
  end
16
18
  end
17
19
  end
@@ -1,3 +1,3 @@
1
1
  module Example
2
- VERSION = "0.3.9"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.add_development_dependency "bundler", ">= 1.0.0"
18
18
  s.add_development_dependency "rails", ">= 3.1.2"
19
19
  s.add_development_dependency "rspec", ">= 2.0.0"
20
+ s.add_development_dependency "sqlite3", ">= 1.3.5"
20
21
 
21
22
  s.files = `git ls-files`.split("\n")
22
23
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
@@ -1,11 +1,27 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Sorted::Orms::ActiveRecord do
4
- before(:each) do
5
- Sorted::Orms::ActiveRecord.enable!
4
+ ActiveRecord::Base.send(:include, Sorted::Orms::ActiveRecord)
5
+
6
+ class SortedActiveRecordTest < ActiveRecord::Base
7
+ establish_connection :adapter => 'sqlite3', :database => '/tmp/foobar.db'
8
+
9
+ connection.create_table table_name, :force => true do |t|
10
+ t.string :name
11
+ end
12
+
13
+ scope :page, lambda {
14
+ limit(50)
15
+ }
6
16
  end
7
17
 
8
18
  it "should integrate with ActiveRecord::Base" do
9
- ActiveRecord::Base.should respond_to(:sort)
19
+ SortedActiveRecordTest.should respond_to(:sorted)
20
+ end
21
+
22
+ it "should play nice with other scopes" do
23
+ sql = "SELECT \"sorted_active_record_tests\".* FROM \"sorted_active_record_tests\" WHERE \"sorted_active_record_tests\".\"name\" = 'bob' ORDER BY name ASC LIMIT 50"
24
+ SortedActiveRecordTest.where(:name => 'bob').page.sorted(nil, 'name ASC').to_sql.should == sql
25
+ SortedActiveRecordTest.page.sorted(nil, 'name ASC').where(:name => 'bob').to_sql.should == sql
10
26
  end
11
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorted
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-20 00:00:00.000000000 Z
12
+ date: 2012-01-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &70134746957060 !ruby/object:Gem::Requirement
16
+ requirement: &70297045252360 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70134746957060
24
+ version_requirements: *70297045252360
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rails
27
- requirement: &70134746956600 !ruby/object:Gem::Requirement
27
+ requirement: &70297045251840 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.1.2
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70134746956600
35
+ version_requirements: *70297045251840
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70134746956100 !ruby/object:Gem::Requirement
38
+ requirement: &70297045251140 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,18 @@ dependencies:
43
43
  version: 2.0.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70134746956100
46
+ version_requirements: *70297045251140
47
+ - !ruby/object:Gem::Dependency
48
+ name: sqlite3
49
+ requirement: &70297045247200 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.5
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70297045247200
47
58
  description: lets you sort large data sets using view helpers and a scope
48
59
  email:
49
60
  - rufuspost@gmail.com
@@ -84,7 +95,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
84
95
  version: '0'
85
96
  segments:
86
97
  - 0
87
- hash: -354722037037653326
98
+ hash: -603896101193403601
88
99
  required_rubygems_version: !ruby/object:Gem::Requirement
89
100
  none: false
90
101
  requirements: