sort_this 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +8 -0
- data/CHANGELOG.md +8 -1
- data/Gemfile +9 -2
- data/Gemfile.rails3.0 +11 -0
- data/Gemfile.rails3.0.lock +122 -0
- data/Gemfile.rails3.1 +11 -0
- data/Gemfile.rails3.1.lock +132 -0
- data/README.md +26 -9
- data/lib/sort_this/active_record.rb +20 -12
- data/lib/sort_this/sort_this_error.rb +4 -0
- data/lib/sort_this/version.rb +1 -1
- data/lib/sort_this.rb +1 -0
- data/sort_this.gemspec +0 -7
- data/spec/active_record_spec.rb +108 -13
- data/spec/spec_helper.rb +0 -1
- data/spec/support/models.rb +4 -0
- metadata +9 -102
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -1,4 +1,11 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
gem 'rails', '~> 3.2.0'
|
4
|
+
gem 'memoist', '0.2.0'
|
5
|
+
|
6
|
+
gem 'rspec', '2.12.0'
|
7
|
+
gem 'sqlite3', '1.3.6'
|
8
|
+
gem 'factory_girl', '4.1.0'
|
9
|
+
gem 'database_cleaner', '0.9.1'
|
10
|
+
gem 'capybara', '2.0.1'
|
11
|
+
gem 'rake'
|
data/Gemfile.rails3.0
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
abstract (1.0.0)
|
5
|
+
actionmailer (3.0.17)
|
6
|
+
actionpack (= 3.0.17)
|
7
|
+
mail (~> 2.2.19)
|
8
|
+
actionpack (3.0.17)
|
9
|
+
activemodel (= 3.0.17)
|
10
|
+
activesupport (= 3.0.17)
|
11
|
+
builder (~> 2.1.2)
|
12
|
+
erubis (~> 2.6.6)
|
13
|
+
i18n (~> 0.5.0)
|
14
|
+
rack (~> 1.2.5)
|
15
|
+
rack-mount (~> 0.6.14)
|
16
|
+
rack-test (~> 0.5.7)
|
17
|
+
tzinfo (~> 0.3.23)
|
18
|
+
activemodel (3.0.17)
|
19
|
+
activesupport (= 3.0.17)
|
20
|
+
builder (~> 2.1.2)
|
21
|
+
i18n (~> 0.5.0)
|
22
|
+
activerecord (3.0.17)
|
23
|
+
activemodel (= 3.0.17)
|
24
|
+
activesupport (= 3.0.17)
|
25
|
+
arel (~> 2.0.10)
|
26
|
+
tzinfo (~> 0.3.23)
|
27
|
+
activeresource (3.0.17)
|
28
|
+
activemodel (= 3.0.17)
|
29
|
+
activesupport (= 3.0.17)
|
30
|
+
activesupport (3.0.17)
|
31
|
+
addressable (2.3.2)
|
32
|
+
arel (2.0.10)
|
33
|
+
builder (2.1.2)
|
34
|
+
capybara (2.0.1)
|
35
|
+
mime-types (>= 1.16)
|
36
|
+
nokogiri (>= 1.3.3)
|
37
|
+
rack (>= 1.0.0)
|
38
|
+
rack-test (>= 0.5.4)
|
39
|
+
selenium-webdriver (~> 2.0)
|
40
|
+
xpath (~> 1.0.0)
|
41
|
+
childprocess (0.3.6)
|
42
|
+
ffi (~> 1.0, >= 1.0.6)
|
43
|
+
database_cleaner (0.9.1)
|
44
|
+
diff-lcs (1.1.3)
|
45
|
+
erubis (2.6.6)
|
46
|
+
abstract (>= 1.0.0)
|
47
|
+
factory_girl (4.1.0)
|
48
|
+
activesupport (>= 3.0.0)
|
49
|
+
ffi (1.2.0)
|
50
|
+
i18n (0.5.0)
|
51
|
+
json (1.7.5)
|
52
|
+
libwebsocket (0.1.7.1)
|
53
|
+
addressable
|
54
|
+
websocket
|
55
|
+
mail (2.2.19)
|
56
|
+
activesupport (>= 2.3.6)
|
57
|
+
i18n (>= 0.4.0)
|
58
|
+
mime-types (~> 1.16)
|
59
|
+
treetop (~> 1.4.8)
|
60
|
+
memoist (0.2.0)
|
61
|
+
mime-types (1.19)
|
62
|
+
multi_json (1.5.0)
|
63
|
+
nokogiri (1.5.6)
|
64
|
+
polyglot (0.3.3)
|
65
|
+
rack (1.2.5)
|
66
|
+
rack-mount (0.6.14)
|
67
|
+
rack (>= 1.0.0)
|
68
|
+
rack-test (0.5.7)
|
69
|
+
rack (>= 1.0)
|
70
|
+
rails (3.0.17)
|
71
|
+
actionmailer (= 3.0.17)
|
72
|
+
actionpack (= 3.0.17)
|
73
|
+
activerecord (= 3.0.17)
|
74
|
+
activeresource (= 3.0.17)
|
75
|
+
activesupport (= 3.0.17)
|
76
|
+
bundler (~> 1.0)
|
77
|
+
railties (= 3.0.17)
|
78
|
+
railties (3.0.17)
|
79
|
+
actionpack (= 3.0.17)
|
80
|
+
activesupport (= 3.0.17)
|
81
|
+
rake (>= 0.8.7)
|
82
|
+
rdoc (~> 3.4)
|
83
|
+
thor (~> 0.14.4)
|
84
|
+
rake (10.0.3)
|
85
|
+
rdoc (3.12)
|
86
|
+
json (~> 1.4)
|
87
|
+
rspec (2.12.0)
|
88
|
+
rspec-core (~> 2.12.0)
|
89
|
+
rspec-expectations (~> 2.12.0)
|
90
|
+
rspec-mocks (~> 2.12.0)
|
91
|
+
rspec-core (2.12.2)
|
92
|
+
rspec-expectations (2.12.1)
|
93
|
+
diff-lcs (~> 1.1.3)
|
94
|
+
rspec-mocks (2.12.1)
|
95
|
+
rubyzip (0.9.9)
|
96
|
+
selenium-webdriver (2.27.2)
|
97
|
+
childprocess (>= 0.2.5)
|
98
|
+
libwebsocket (~> 0.1.3)
|
99
|
+
multi_json (~> 1.0)
|
100
|
+
rubyzip
|
101
|
+
sqlite3 (1.3.6)
|
102
|
+
thor (0.14.6)
|
103
|
+
treetop (1.4.12)
|
104
|
+
polyglot
|
105
|
+
polyglot (>= 0.3.1)
|
106
|
+
tzinfo (0.3.35)
|
107
|
+
websocket (1.0.6)
|
108
|
+
xpath (1.0.0)
|
109
|
+
nokogiri (~> 1.3)
|
110
|
+
|
111
|
+
PLATFORMS
|
112
|
+
ruby
|
113
|
+
|
114
|
+
DEPENDENCIES
|
115
|
+
capybara (= 2.0.1)
|
116
|
+
database_cleaner (= 0.9.1)
|
117
|
+
factory_girl (= 4.1.0)
|
118
|
+
memoist (= 0.2.0)
|
119
|
+
rails (~> 3.0.0)
|
120
|
+
rake
|
121
|
+
rspec (= 2.12.0)
|
122
|
+
sqlite3 (= 1.3.6)
|
data/Gemfile.rails3.1
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
actionmailer (3.1.8)
|
5
|
+
actionpack (= 3.1.8)
|
6
|
+
mail (~> 2.3.3)
|
7
|
+
actionpack (3.1.8)
|
8
|
+
activemodel (= 3.1.8)
|
9
|
+
activesupport (= 3.1.8)
|
10
|
+
builder (~> 3.0.0)
|
11
|
+
erubis (~> 2.7.0)
|
12
|
+
i18n (~> 0.6)
|
13
|
+
rack (~> 1.3.6)
|
14
|
+
rack-cache (~> 1.2)
|
15
|
+
rack-mount (~> 0.8.2)
|
16
|
+
rack-test (~> 0.6.1)
|
17
|
+
sprockets (~> 2.0.4)
|
18
|
+
activemodel (3.1.8)
|
19
|
+
activesupport (= 3.1.8)
|
20
|
+
builder (~> 3.0.0)
|
21
|
+
i18n (~> 0.6)
|
22
|
+
activerecord (3.1.8)
|
23
|
+
activemodel (= 3.1.8)
|
24
|
+
activesupport (= 3.1.8)
|
25
|
+
arel (~> 2.2.3)
|
26
|
+
tzinfo (~> 0.3.29)
|
27
|
+
activeresource (3.1.8)
|
28
|
+
activemodel (= 3.1.8)
|
29
|
+
activesupport (= 3.1.8)
|
30
|
+
activesupport (3.1.8)
|
31
|
+
multi_json (>= 1.0, < 1.3)
|
32
|
+
addressable (2.3.2)
|
33
|
+
arel (2.2.3)
|
34
|
+
builder (3.0.4)
|
35
|
+
capybara (2.0.1)
|
36
|
+
mime-types (>= 1.16)
|
37
|
+
nokogiri (>= 1.3.3)
|
38
|
+
rack (>= 1.0.0)
|
39
|
+
rack-test (>= 0.5.4)
|
40
|
+
selenium-webdriver (~> 2.0)
|
41
|
+
xpath (~> 1.0.0)
|
42
|
+
childprocess (0.3.6)
|
43
|
+
ffi (~> 1.0, >= 1.0.6)
|
44
|
+
database_cleaner (0.9.1)
|
45
|
+
diff-lcs (1.1.3)
|
46
|
+
erubis (2.7.0)
|
47
|
+
factory_girl (4.1.0)
|
48
|
+
activesupport (>= 3.0.0)
|
49
|
+
ffi (1.2.0)
|
50
|
+
hike (1.2.1)
|
51
|
+
i18n (0.6.1)
|
52
|
+
json (1.7.5)
|
53
|
+
libwebsocket (0.1.7.1)
|
54
|
+
addressable
|
55
|
+
websocket
|
56
|
+
mail (2.3.3)
|
57
|
+
i18n (>= 0.4.0)
|
58
|
+
mime-types (~> 1.16)
|
59
|
+
treetop (~> 1.4.8)
|
60
|
+
memoist (0.2.0)
|
61
|
+
mime-types (1.19)
|
62
|
+
multi_json (1.2.0)
|
63
|
+
nokogiri (1.5.6)
|
64
|
+
polyglot (0.3.3)
|
65
|
+
rack (1.3.6)
|
66
|
+
rack-cache (1.2)
|
67
|
+
rack (>= 0.4)
|
68
|
+
rack-mount (0.8.3)
|
69
|
+
rack (>= 1.0.0)
|
70
|
+
rack-ssl (1.3.2)
|
71
|
+
rack
|
72
|
+
rack-test (0.6.2)
|
73
|
+
rack (>= 1.0)
|
74
|
+
rails (3.1.8)
|
75
|
+
actionmailer (= 3.1.8)
|
76
|
+
actionpack (= 3.1.8)
|
77
|
+
activerecord (= 3.1.8)
|
78
|
+
activeresource (= 3.1.8)
|
79
|
+
activesupport (= 3.1.8)
|
80
|
+
bundler (~> 1.0)
|
81
|
+
railties (= 3.1.8)
|
82
|
+
railties (3.1.8)
|
83
|
+
actionpack (= 3.1.8)
|
84
|
+
activesupport (= 3.1.8)
|
85
|
+
rack-ssl (~> 1.3.2)
|
86
|
+
rake (>= 0.8.7)
|
87
|
+
rdoc (~> 3.4)
|
88
|
+
thor (~> 0.14.6)
|
89
|
+
rake (10.0.3)
|
90
|
+
rdoc (3.12)
|
91
|
+
json (~> 1.4)
|
92
|
+
rspec (2.12.0)
|
93
|
+
rspec-core (~> 2.12.0)
|
94
|
+
rspec-expectations (~> 2.12.0)
|
95
|
+
rspec-mocks (~> 2.12.0)
|
96
|
+
rspec-core (2.12.2)
|
97
|
+
rspec-expectations (2.12.1)
|
98
|
+
diff-lcs (~> 1.1.3)
|
99
|
+
rspec-mocks (2.12.1)
|
100
|
+
rubyzip (0.9.9)
|
101
|
+
selenium-webdriver (2.27.2)
|
102
|
+
childprocess (>= 0.2.5)
|
103
|
+
libwebsocket (~> 0.1.3)
|
104
|
+
multi_json (~> 1.0)
|
105
|
+
rubyzip
|
106
|
+
sprockets (2.0.4)
|
107
|
+
hike (~> 1.2)
|
108
|
+
rack (~> 1.0)
|
109
|
+
tilt (~> 1.1, != 1.3.0)
|
110
|
+
sqlite3 (1.3.6)
|
111
|
+
thor (0.14.6)
|
112
|
+
tilt (1.3.3)
|
113
|
+
treetop (1.4.12)
|
114
|
+
polyglot
|
115
|
+
polyglot (>= 0.3.1)
|
116
|
+
tzinfo (0.3.35)
|
117
|
+
websocket (1.0.6)
|
118
|
+
xpath (1.0.0)
|
119
|
+
nokogiri (~> 1.3)
|
120
|
+
|
121
|
+
PLATFORMS
|
122
|
+
ruby
|
123
|
+
|
124
|
+
DEPENDENCIES
|
125
|
+
capybara (= 2.0.1)
|
126
|
+
database_cleaner (= 0.9.1)
|
127
|
+
factory_girl (= 4.1.0)
|
128
|
+
memoist (= 0.2.0)
|
129
|
+
rails (~> 3.1.0)
|
130
|
+
rake
|
131
|
+
rspec (= 2.12.0)
|
132
|
+
sqlite3 (= 1.3.6)
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# SortThis
|
1
|
+
# SortThis [![Build Status](https://secure.travis-ci.org/spullen/sort_this.png)](http://travis-ci.org/spullen/sort_this)
|
2
2
|
|
3
3
|
SortThis provides a way to sort.
|
4
4
|
|
@@ -10,7 +10,7 @@ Here is an [example app](https://github.com/spullen/sort_example) that demonstra
|
|
10
10
|
|
11
11
|
Add this line to your application's Gemfile:
|
12
12
|
|
13
|
-
gem 'sort_this'
|
13
|
+
gem 'sort_this'
|
14
14
|
|
15
15
|
And then execute:
|
16
16
|
|
@@ -24,7 +24,7 @@ Add a call to the `sortable` method with a hash of sorts
|
|
24
24
|
|
25
25
|
class YourModel < ActiveRecord::Base
|
26
26
|
|
27
|
-
sort_this :sort_name => {:column_name => :name, :default => 'ASC', :joins => :association, :clause => "some.clause"}
|
27
|
+
sort_this :sort_name => {:column_name => :name, :default => 'ASC', :table_name => 'some_other_table_name', :joins => :association, :clause => "some.clause"}
|
28
28
|
|
29
29
|
end
|
30
30
|
|
@@ -34,14 +34,16 @@ The options are
|
|
34
34
|
|
35
35
|
Sort Options:
|
36
36
|
|
37
|
-
column_name: (
|
37
|
+
column_name: (Optional) The name of the column to sort on. If left blank it will use the sort name.
|
38
38
|
default: (Optional) Defines a default sort if provided. The valid options are 'ASC' or 'DESC'.
|
39
|
-
|
39
|
+
table_name (Optional) Overrides the table name used, should usually be used in coordination with joins.
|
40
|
+
joins: (Optional) Defines an association to join on, this should be provided if the column is in another table. ** Requires table name to be set. **
|
41
|
+
This is what you would usually pass into a joins or includes clause for ActiveRecord.
|
40
42
|
clause: (Optional) Overrides the clause used for the sort.
|
41
43
|
|
42
44
|
Then to sort
|
43
45
|
|
44
|
-
YourModel.sort("sort_name", "asc|desc") => sorted list of YourModel objects
|
46
|
+
YourModel.sort("sort_name", "asc|desc|ASC|DESC") => sorted list of YourModel objects
|
45
47
|
|
46
48
|
### Controller
|
47
49
|
|
@@ -67,11 +69,26 @@ In you controller define a default sort
|
|
67
69
|
|
68
70
|
## TODO:
|
69
71
|
|
70
|
-
|
71
|
-
- Add the ability to customize the sort and direction parameters
|
72
|
-
- Define scopes for each sort defined (individual sort scopes)
|
72
|
+
Defined Highest to Lowest priority
|
73
73
|
|
74
|
+
- Throw error when the table_name option is not set and joins is set.
|
75
|
+
- Being able to define multiple column sorts
|
76
|
+
|
77
|
+
Something like:
|
78
|
+
sort_this :some_crazy_sort => {
|
79
|
+
[
|
80
|
+
{:column_name => :some_column, other options},
|
81
|
+
...
|
82
|
+
]
|
83
|
+
}
|
84
|
+
|
85
|
+
not sure how that'd be called though...
|
86
|
+
|
87
|
+
- Define a default scope and remove from the sort method, gives more control to developer.
|
88
|
+
- Define scopes for each sort defined (individual sort scopes)
|
89
|
+
- Add the ability to customize the sort and direction parameters
|
74
90
|
- Testing on different databases (should probably hit postgresql and mysql unless the way SQLite handles it in the same way)
|
91
|
+
- Define rails 3.0 with ruby 1.8.7 gemfile for travis ci tests as 1.8.7 is still prevelant for 3.0
|
75
92
|
|
76
93
|
## Contributing
|
77
94
|
|
@@ -7,8 +7,7 @@ module SortThis
|
|
7
7
|
base.class_eval do
|
8
8
|
extend ClassMethods
|
9
9
|
|
10
|
-
class << self; extend Memoist; self; end.memoize :sort
|
11
|
-
|
10
|
+
class << self; extend Memoist; self; end.memoize :sort, :default_sort
|
12
11
|
|
13
12
|
class_attribute :sort_columns, :default_sort_columns
|
14
13
|
end
|
@@ -19,10 +18,10 @@ module SortThis
|
|
19
18
|
#
|
20
19
|
# Input is a hash of sort_name => sort_options pairs
|
21
20
|
#
|
22
|
-
# :column_name => (
|
21
|
+
# :column_name => (optional) Column name to sort on, if left blank it will use the sort_name
|
23
22
|
# :default => (optional) 'ASC'|'DESC'
|
23
|
+
# :table_name => (optional) Override the table name, required if using joins
|
24
24
|
# :joins => (optional) Association to join on. Note: must be an association of the model being sorted.
|
25
|
-
# Prefixes the column_name with the table name to prevent collisions
|
26
25
|
# :clause => (optional) Override the clause of the sort
|
27
26
|
#
|
28
27
|
# ex.
|
@@ -33,34 +32,43 @@ module SortThis
|
|
33
32
|
#
|
34
33
|
# :sort_name1 => { :column_name => :quantity }
|
35
34
|
# :sort_name2 => { :column_name => :price, :default => 'DESC' }
|
36
|
-
# :sort_name3 => { :column_name => :name, :joins => :product }
|
35
|
+
# :sort_name3 => { :column_name => :name, :table_name => 'products', :joins => :product }
|
37
36
|
#
|
38
37
|
def sort_this(sorts = {})
|
39
38
|
self.sort_columns = {}
|
40
39
|
self.default_sort_columns = {}
|
41
40
|
|
42
|
-
empty_sort_options = { :column_name => nil, :default => nil, :joins => nil, :clause => nil }
|
41
|
+
empty_sort_options = { :column_name => nil, :default => nil, :table_name => nil, :joins => nil, :clause => nil }
|
43
42
|
|
44
43
|
sorts.each do |sort_name, sort_options|
|
45
44
|
sort_options = empty_sort_options.merge(sort_options)
|
46
45
|
|
47
46
|
self.sort_columns[sort_name] = sort_options
|
48
47
|
|
49
|
-
column = sort_options[:column_name]
|
50
|
-
table = (sort_options[:
|
51
|
-
clause = (sort_options[:clause].blank?)
|
48
|
+
column = (sort_options[:column_name].blank?) ? sort_name : sort_options[:column_name]
|
49
|
+
table = (sort_options[:table_name].blank?) ? table_name : sort_options[:table_name].to_s.pluralize
|
50
|
+
clause = (sort_options[:clause].blank?) ? "#{table}.#{column}" : sort_options[:clause]
|
52
51
|
|
53
|
-
self.sort_columns[sort_name][:
|
52
|
+
self.sort_columns[sort_name][:column_name] = column
|
53
|
+
self.sort_columns[sort_name][:table_name] = table
|
54
|
+
self.sort_columns[sort_name][:clause] = clause
|
54
55
|
|
55
56
|
unless sort_options[:default].blank?
|
56
|
-
# TODO: raise exception if the default is not ASC|DESC
|
57
57
|
default_sort_direction = sort_options[:default].upcase
|
58
|
+
|
59
|
+
unless VALID_SORT_DIRECTIONS.include?(default_sort_direction)
|
60
|
+
raise SortThisError, "Invalid sort direction for: #{sort_name}. Must be 'ASC'/'asc' or 'DESC'/'desc'."
|
61
|
+
end
|
62
|
+
|
58
63
|
self.default_sort_columns[sort_name] = "#{clause} #{default_sort_direction}"
|
59
64
|
end
|
60
|
-
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
68
|
+
def default_sort
|
69
|
+
order(self.default_sort_columns.values.join(', '))
|
70
|
+
end
|
71
|
+
|
64
72
|
def sort(sort_column = nil, sort_direction = DEFAULT_SORT_DIRECTION)
|
65
73
|
query = scoped
|
66
74
|
|
data/lib/sort_this/version.rb
CHANGED
data/lib/sort_this.rb
CHANGED
data/sort_this.gemspec
CHANGED
@@ -19,11 +19,4 @@ Gem::Specification.new do |gem|
|
|
19
19
|
|
20
20
|
gem.add_dependency 'rails', '>= 3.0'
|
21
21
|
gem.add_dependency 'memoist', '0.2.0'
|
22
|
-
|
23
|
-
gem.add_development_dependency 'debugger', '1.2.2'
|
24
|
-
gem.add_development_dependency 'rspec', '2.12.0'
|
25
|
-
gem.add_development_dependency 'sqlite3', '1.3.6'
|
26
|
-
gem.add_development_dependency 'factory_girl', '4.1.0'
|
27
|
-
gem.add_development_dependency 'database_cleaner', '0.9.1'
|
28
|
-
gem.add_development_dependency 'capybara', '2.0.1'
|
29
22
|
end
|
data/spec/active_record_spec.rb
CHANGED
@@ -43,6 +43,10 @@ describe SortThis::ActiveRecord do
|
|
43
43
|
Quote.sort_columns[sort_name][:default].should == default_option
|
44
44
|
end
|
45
45
|
|
46
|
+
it 'should properly set the table_name' do
|
47
|
+
Quote.sort_columns[sort_name][:table_name].should == table_name_option
|
48
|
+
end
|
49
|
+
|
46
50
|
it 'should properly set the joins option' do
|
47
51
|
Quote.sort_columns[sort_name][:joins].should == joins_option
|
48
52
|
end
|
@@ -67,15 +71,16 @@ describe SortThis::ActiveRecord do
|
|
67
71
|
end
|
68
72
|
end
|
69
73
|
|
70
|
-
context 'given a sort column with
|
74
|
+
context 'given a sort column with no options specified' do
|
71
75
|
let!(:sort_name) { :price }
|
72
76
|
let!(:column_name_option) { :price }
|
77
|
+
let!(:table_name_option) { 'quotes' }
|
73
78
|
let!(:default_option) { nil }
|
74
79
|
let!(:joins_option) { nil }
|
75
80
|
let!(:clause_option) { "quotes.price" }
|
76
|
-
|
81
|
+
|
77
82
|
before(:each) do
|
78
|
-
Quote.sort_this sort_name => {
|
83
|
+
Quote.sort_this sort_name => {}
|
79
84
|
end
|
80
85
|
|
81
86
|
it_should_behave_like 'sort_columns_defined'
|
@@ -85,37 +90,75 @@ describe SortThis::ActiveRecord do
|
|
85
90
|
end
|
86
91
|
end
|
87
92
|
|
88
|
-
context 'given a sort column with
|
93
|
+
context 'given a sort column with just the required sort options' do
|
89
94
|
let!(:sort_name) { :price }
|
90
95
|
let!(:column_name_option) { :price }
|
91
|
-
let!(:
|
96
|
+
let!(:table_name_option) { 'quotes' }
|
97
|
+
let!(:default_option) { nil }
|
92
98
|
let!(:joins_option) { nil }
|
93
99
|
let!(:clause_option) { "quotes.price" }
|
94
100
|
|
95
101
|
before(:each) do
|
96
|
-
Quote.sort_this sort_name => {:column_name => column_name_option
|
102
|
+
Quote.sort_this sort_name => {:column_name => column_name_option}
|
97
103
|
end
|
98
104
|
|
99
105
|
it_should_behave_like 'sort_columns_defined'
|
100
106
|
|
101
|
-
it 'should set
|
102
|
-
Quote.default_sort_columns.should
|
107
|
+
it 'should set default_sort_columns to an empty hash' do
|
108
|
+
Quote.default_sort_columns.should == {}
|
103
109
|
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'given a sort column with a default specified in the sort options' do
|
113
|
+
context 'when the default is valid' do
|
114
|
+
let!(:sort_name) { :price }
|
115
|
+
let!(:column_name_option) { :price }
|
116
|
+
let!(:table_name_option) { 'quotes' }
|
117
|
+
let!(:default_option) { 'DESC' }
|
118
|
+
let!(:joins_option) { nil }
|
119
|
+
let!(:clause_option) { "quotes.price" }
|
104
120
|
|
105
|
-
|
106
|
-
|
121
|
+
before(:each) do
|
122
|
+
Quote.sort_this sort_name => {:column_name => column_name_option, :default => default_option}
|
123
|
+
end
|
124
|
+
|
125
|
+
it_should_behave_like 'sort_columns_defined'
|
126
|
+
|
127
|
+
it 'should set the default_sort_columns options for the specified sort name' do
|
128
|
+
Quote.default_sort_columns.should have_key(sort_name)
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should set the clause of the default_sort_columns for the specified sort name' do
|
132
|
+
Quote.default_sort_columns[sort_name].should == "#{clause_option} #{default_option}"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
context 'when the default is not ASC or DESC' do
|
137
|
+
let!(:sort_name) { :quantity }
|
138
|
+
let!(:column_name_option) { :quantity }
|
139
|
+
let!(:table_name_option) { 'quotes' }
|
140
|
+
let!(:default_option) { 'GARBAGE' }
|
141
|
+
let!(:joins_option) { nil }
|
142
|
+
let!(:clause_option) { "custom.joins_clause" }
|
143
|
+
|
144
|
+
it 'should raise a SortThisError' do
|
145
|
+
lambda {
|
146
|
+
Quote.sort_this sort_name => {:column_name => column_name_option, :default => default_option, :clause => clause_option}
|
147
|
+
}.should raise_error(SortThis::SortThisError, "Invalid sort direction for: #{sort_name}. Must be 'ASC'/'asc' or 'DESC'/'desc'.")
|
148
|
+
end
|
107
149
|
end
|
108
150
|
end
|
109
151
|
|
110
152
|
context 'given a sort column with a joins specified in the sort options' do
|
111
153
|
let!(:sort_name) { :product_name }
|
112
154
|
let!(:column_name_option) { :name }
|
155
|
+
let!(:table_name_option) { 'products' }
|
113
156
|
let!(:default_option) { nil }
|
114
157
|
let!(:joins_option) { :product }
|
115
158
|
let!(:clause_option) { "products.name" }
|
116
159
|
|
117
160
|
before(:each) do
|
118
|
-
Quote.sort_this sort_name => {:column_name => column_name_option, :joins => joins_option}
|
161
|
+
Quote.sort_this sort_name => {:column_name => column_name_option, :table_name => table_name_option, :joins => joins_option}
|
119
162
|
end
|
120
163
|
|
121
164
|
it_should_behave_like 'sort_columns_defined'
|
@@ -128,6 +171,7 @@ describe SortThis::ActiveRecord do
|
|
128
171
|
context 'given a sort column with a custom clause specified in the sort options' do
|
129
172
|
let!(:sort_name) { :price }
|
130
173
|
let!(:column_name_option) { :price }
|
174
|
+
let!(:table_name_option) { 'quotes' }
|
131
175
|
let!(:default_option) { nil }
|
132
176
|
let!(:joins_option) { nil }
|
133
177
|
let!(:clause_option) { "custom.joins_clause" }
|
@@ -146,6 +190,7 @@ describe SortThis::ActiveRecord do
|
|
146
190
|
context 'given a sort column with a custom clause and default specified in the sort options' do
|
147
191
|
let!(:sort_name) { :quantity }
|
148
192
|
let!(:column_name_option) { :quantity }
|
193
|
+
let!(:table_name_option) { 'quotes' }
|
149
194
|
let!(:default_option) { 'DESC' }
|
150
195
|
let!(:joins_option) { nil }
|
151
196
|
let!(:clause_option) { "custom.joins_clause" }
|
@@ -164,6 +209,52 @@ describe SortThis::ActiveRecord do
|
|
164
209
|
Quote.default_sort_columns[sort_name].should == "#{clause_option} #{default_option}"
|
165
210
|
end
|
166
211
|
end
|
212
|
+
|
213
|
+
context 'given a sort column where the table name is overridden' do
|
214
|
+
context 'when the table name option is already pluralized' do
|
215
|
+
let!(:sort_name) { :price }
|
216
|
+
let!(:column_name_option) { :price }
|
217
|
+
let!(:table_name_option) { 'some_other_tables' }
|
218
|
+
let!(:default_option) { nil }
|
219
|
+
let!(:joins_option) { nil }
|
220
|
+
let!(:clause_option) { "some_other_tables.price" }
|
221
|
+
|
222
|
+
before(:each) do
|
223
|
+
Quote.sort_this sort_name => {:table_name => table_name_option}
|
224
|
+
end
|
225
|
+
|
226
|
+
it_should_behave_like 'sort_columns_defined'
|
227
|
+
end
|
228
|
+
|
229
|
+
context 'when the table name option is not pluralized' do
|
230
|
+
let!(:table_name_singular) { 'another_table' }
|
231
|
+
|
232
|
+
let!(:sort_name) { :price }
|
233
|
+
let!(:column_name_option) { :price }
|
234
|
+
let!(:table_name_option) { 'another_tables' }
|
235
|
+
let!(:default_option) { nil }
|
236
|
+
let!(:joins_option) { nil }
|
237
|
+
let!(:clause_option) { "another_tables.price" }
|
238
|
+
|
239
|
+
before(:each) do
|
240
|
+
Quote.sort_this sort_name => {:table_name => table_name_option}
|
241
|
+
end
|
242
|
+
|
243
|
+
it_should_behave_like 'sort_columns_defined'
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
describe '.default_sort' do
|
249
|
+
let!(:product1) { create(:product, :name => 'D Name') }
|
250
|
+
let!(:product2) { create(:product, :name => 'B Name') }
|
251
|
+
let!(:product3) { create(:product, :name => 'A Name') }
|
252
|
+
let!(:product4) { create(:product, :name => 'C Name') }
|
253
|
+
|
254
|
+
it 'should return a sorted collection given by the specified default sort' do
|
255
|
+
Product.sort_this(:name => { :column_name => :name, :default => 'DESC' })
|
256
|
+
Product.default_sort.should == [product1, product4, product2, product3]
|
257
|
+
end
|
167
258
|
end
|
168
259
|
|
169
260
|
describe '.sort' do
|
@@ -185,8 +276,12 @@ describe SortThis::ActiveRecord do
|
|
185
276
|
before(:each) do
|
186
277
|
Quote.sort_this :price => {:column_name => :price, :default => 'ASC'},
|
187
278
|
:quantity => {:column_name => :quantity},
|
188
|
-
:product_name => {:column_name => :name, :joins => :product},
|
189
|
-
:vendor_name => {:column_name => :name, :joins => :vendor}
|
279
|
+
:product_name => {:column_name => :name, :table_name => 'products', :joins => :product},
|
280
|
+
:vendor_name => {:column_name => :name, :table_name => 'vendors', :joins => :vendor}
|
281
|
+
end
|
282
|
+
|
283
|
+
it 'should return a relation' do
|
284
|
+
Quote.sort.class.should == ActiveRecord::Relation
|
190
285
|
end
|
191
286
|
|
192
287
|
context 'default parameters' do
|
data/spec/spec_helper.rb
CHANGED
data/spec/support/models.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sort_this
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -43,102 +43,6 @@ dependencies:
|
|
43
43
|
- - '='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 0.2.0
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: debugger
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - '='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 1.2.2
|
54
|
-
type: :development
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - '='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.2.2
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: rspec
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - '='
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: 2.12.0
|
70
|
-
type: :development
|
71
|
-
prerelease: false
|
72
|
-
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - '='
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 2.12.0
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: sqlite3
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - '='
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: 1.3.6
|
86
|
-
type: :development
|
87
|
-
prerelease: false
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - '='
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 1.3.6
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: factory_girl
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - '='
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: 4.1.0
|
102
|
-
type: :development
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - '='
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 4.1.0
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: database_cleaner
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - '='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: 0.9.1
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - '='
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: 0.9.1
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: capybara
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - '='
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: 2.0.1
|
134
|
-
type: :development
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - '='
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: 2.0.1
|
142
46
|
description: SortThis
|
143
47
|
email:
|
144
48
|
- s.pullen05@gmail.com
|
@@ -149,8 +53,13 @@ files:
|
|
149
53
|
- .gitignore
|
150
54
|
- .rspec
|
151
55
|
- .rvmrc
|
56
|
+
- .travis.yml
|
152
57
|
- CHANGELOG.md
|
153
58
|
- Gemfile
|
59
|
+
- Gemfile.rails3.0
|
60
|
+
- Gemfile.rails3.0.lock
|
61
|
+
- Gemfile.rails3.1
|
62
|
+
- Gemfile.rails3.1.lock
|
154
63
|
- LICENSE.txt
|
155
64
|
- README.md
|
156
65
|
- Rakefile
|
@@ -158,6 +67,7 @@ files:
|
|
158
67
|
- lib/sort_this/action_controller.rb
|
159
68
|
- lib/sort_this/active_record.rb
|
160
69
|
- lib/sort_this/railtie.rb
|
70
|
+
- lib/sort_this/sort_this_error.rb
|
161
71
|
- lib/sort_this/version.rb
|
162
72
|
- lib/sort_this/view_helpers/action_view.rb
|
163
73
|
- sort_this.gemspec
|
@@ -182,16 +92,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
92
|
version: '0'
|
183
93
|
segments:
|
184
94
|
- 0
|
185
|
-
hash:
|
95
|
+
hash: -2410530305062139336
|
186
96
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
97
|
none: false
|
188
98
|
requirements:
|
189
99
|
- - ! '>='
|
190
100
|
- !ruby/object:Gem::Version
|
191
101
|
version: '0'
|
192
|
-
segments:
|
193
|
-
- 0
|
194
|
-
hash: 2103404262135696406
|
195
102
|
requirements: []
|
196
103
|
rubyforge_project:
|
197
104
|
rubygems_version: 1.8.24
|