sorted 1.1.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -43
- data/Rakefile +12 -18
- data/lib/sorted.rb +19 -6
- data/lib/sorted/version.rb +1 -1
- data/sorted.gemspec +3 -5
- data/spec/json_query_spec.rb +20 -0
- data/spec/set_spec.rb +74 -0
- data/spec/spec_helper.rb +1 -4
- data/spec/sql_query_spec.rb +61 -0
- data/spec/uri_query_spec.rb +20 -0
- metadata +7 -48
- data/gemfiles/active_record_40.gemfile +0 -9
- data/gemfiles/active_record_40.gemfile.lock +0 -109
- data/gemfiles/mongoid_30.gemfile +0 -7
- data/gemfiles/mongoid_30.gemfile.lock +0 -113
- data/lib/sorted/orms/active_record.rb +0 -34
- data/lib/sorted/orms/mongoid.rb +0 -18
- data/lib/sorted/parser.rb +0 -68
- data/lib/sorted/railtie.rb +0 -24
- data/lib/sorted/toggler.rb +0 -27
- data/lib/sorted/view_helpers/action_view.rb +0 -86
- data/spec/sorted/orms/active_record_spec.rb +0 -33
- data/spec/sorted/orms/mongoid_spec.rb +0 -32
- data/spec/sorted/parser_spec.rb +0 -117
- data/spec/sorted/toggler_spec.rb +0 -75
- data/spec/sorted/view_helpers/action_view_spec.rb +0 -63
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
if defined? ActiveRecord
|
4
|
-
describe Sorted::Orms::ActiveRecord do
|
5
|
-
ActiveRecord::Base.send(:include, Sorted::Orms::ActiveRecord)
|
6
|
-
|
7
|
-
class SortedActiveRecordTest < ActiveRecord::Base
|
8
|
-
establish_connection adapter: 'sqlite3', database: ':memory:'
|
9
|
-
|
10
|
-
connection.create_table table_name, force: true do |t|
|
11
|
-
t.string :name
|
12
|
-
end
|
13
|
-
|
14
|
-
scope :page, -> { limit(50) }
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'should integrate with ActiveRecord::Base' do
|
18
|
-
SortedActiveRecordTest.should respond_to(:sorted)
|
19
|
-
SortedActiveRecordTest.should respond_to(:resorted)
|
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
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'should override the provided order' do
|
29
|
-
sql = "SELECT \"sorted_active_record_tests\".* FROM \"sorted_active_record_tests\" WHERE \"sorted_active_record_tests\".\"name\" = 'bob' ORDER BY \"name\" ASC LIMIT 50"
|
30
|
-
SortedActiveRecordTest.page.where(name: 'bob').order(:id).sorted(nil, 'name DESC').resorted(nil, 'name ASC').to_sql.should == sql
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
if defined? Mongoid
|
4
|
-
describe Sorted::Orms::Mongoid do
|
5
|
-
::Mongoid::Criteria.send :include, Sorted::Orms::Mongoid
|
6
|
-
::Mongoid::Document.send :include, Sorted::Orms::Mongoid
|
7
|
-
|
8
|
-
class SortedMongoidTest
|
9
|
-
include ::Mongoid::Document
|
10
|
-
|
11
|
-
field :name, type: String
|
12
|
-
|
13
|
-
def self.page
|
14
|
-
limit(50)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'should integrate with Mongoid::Document' do
|
19
|
-
SortedMongoidTest.should respond_to(:sorted)
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should integrate with Mongoid::Criteria' do
|
23
|
-
SortedMongoidTest.page.should respond_to(:sorted)
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should play nice with other scopes' do
|
27
|
-
query_options = { limit: 50, sort: { 'name' => 1 } }
|
28
|
-
SortedMongoidTest.page.sorted(nil, 'name ASC').options.should == query_options
|
29
|
-
SortedMongoidTest.page.sorted(nil, 'name ASC').options.should == query_options
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/spec/sorted/parser_spec.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Sorted::Parser, 'params parsing' do
|
4
|
-
it 'should not raise if pased nil arguments' do
|
5
|
-
-> { Sorted::Parser.new(nil, nil).toggle }.should_not raise_error
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'should return a nice array from the order sql' do
|
9
|
-
sort = nil
|
10
|
-
order = 'email ASC, phone ASC, name DESC'
|
11
|
-
result = [['email', 'asc'], ['phone', 'asc'], ['name', 'desc']]
|
12
|
-
|
13
|
-
sorter = Sorted::Parser.new(sort, order)
|
14
|
-
sorter.orders.should eq result
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'should return a nice array from the sort params' do
|
18
|
-
sort = 'email_desc!name_desc'
|
19
|
-
order = nil
|
20
|
-
result = [['email', 'desc'], ['name', 'desc']]
|
21
|
-
|
22
|
-
sorter = Sorted::Parser.new(sort, order)
|
23
|
-
sorter.sorts.should eq result
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should combine sort and order params with sort params being of higer importance' do
|
27
|
-
sort = 'email_desc!name_desc'
|
28
|
-
order = 'email ASC, phone ASC, name DESC'
|
29
|
-
result = [['email', 'desc'], ['name', 'desc'], ['phone', 'asc']]
|
30
|
-
|
31
|
-
sorter = Sorted::Parser.new(sort, order)
|
32
|
-
sorter.to_a.should eq result
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should allow numbers, underscores and full stops in sort params' do
|
36
|
-
sort = 'assessmentsTable.name_desc!users_300.name_5_desc'
|
37
|
-
order = nil
|
38
|
-
result = [['assessmentsTable.name', 'desc'], ['users_300.name_5', 'desc']]
|
39
|
-
|
40
|
-
sorter = Sorted::Parser.new(sort, order)
|
41
|
-
sorter.sorts.should eq result
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should allow numbers, underscores and full stops in order params' do
|
45
|
-
sort = nil
|
46
|
-
order = 'assessmentsTable.name ASC, users_300.name_5 ASC'
|
47
|
-
result = [['assessmentsTable.name', 'asc'], ['users_300.name_5', 'asc']]
|
48
|
-
|
49
|
-
sorter = Sorted::Parser.new(sort, order)
|
50
|
-
sorter.orders.should eq result
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'should default to asc if sort params order is ommited' do
|
54
|
-
sort = nil
|
55
|
-
order = :email
|
56
|
-
result = [['email', 'asc']]
|
57
|
-
|
58
|
-
sorter = Sorted::Parser.new(sort, order)
|
59
|
-
sorter.orders.should eq result
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe Sorted::Parser, 'return types' do
|
64
|
-
module FakeConnection
|
65
|
-
def self.quote_column_name(column_name)
|
66
|
-
"`#{column_name}`"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
let(:quoter) {
|
71
|
-
->(frag) { FakeConnection.quote_column_name(frag) }
|
72
|
-
}
|
73
|
-
|
74
|
-
it 'should properly escape sql column names' do
|
75
|
-
order = 'users.name DESC'
|
76
|
-
result = '`users`.`name` DESC'
|
77
|
-
|
78
|
-
sorter = Sorted::Parser.new(nil, order)
|
79
|
-
sorter.to_sql(quoter).should eq result
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'should return an sql sort string' do
|
83
|
-
sort = 'email_desc!name_desc'
|
84
|
-
order = 'email ASC, phone ASC, name DESC'
|
85
|
-
result = '`email` DESC, `name` DESC, `phone` ASC'
|
86
|
-
|
87
|
-
sorter = Sorted::Parser.new(sort, order)
|
88
|
-
sorter.to_sql(quoter).should eq result
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'should return an hash' do
|
92
|
-
sort = 'email_desc!name_desc'
|
93
|
-
order = 'email ASC, phone ASC, name DESC'
|
94
|
-
result = { 'email' => 'desc', 'name' => 'desc', 'phone' => 'asc' }
|
95
|
-
|
96
|
-
sorter = Sorted::Parser.new(sort, order)
|
97
|
-
sorter.to_hash.should eq result
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'should return an the encoded sort string' do
|
101
|
-
sort = 'email_desc!name_desc'
|
102
|
-
order = 'email ASC, phone ASC, name DESC'
|
103
|
-
result = 'email_desc!name_desc!phone_asc'
|
104
|
-
|
105
|
-
sorter = Sorted::Parser.new(sort, order)
|
106
|
-
sorter.to_s.should eq result
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'sql injection using order by clause should not work' do
|
110
|
-
sort = '(case+when+((ASCII(SUBSTR((select+table_name+from+all_tables+where+rownum%3d1),1))>%3D128))+then+id+else+something+end)'
|
111
|
-
order = 'email ASC, phone ASC, name DESC'
|
112
|
-
result = '`email` ASC, `phone` ASC, `name` DESC'
|
113
|
-
|
114
|
-
sorter = Sorted::Parser.new(sort, order)
|
115
|
-
sorter.to_sql(quoter).should eq result
|
116
|
-
end
|
117
|
-
end
|
data/spec/sorted/toggler_spec.rb
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Sorted::Toggler do
|
4
|
-
it 'should bring phone to first order importance but not toggle ascendance' do
|
5
|
-
orders = [['email', 'asc'], ['phone', 'asc']]
|
6
|
-
sorts = [['phone', 'asc']]
|
7
|
-
result = [['phone', 'asc'], ['email', 'asc']]
|
8
|
-
|
9
|
-
toggler = Sorted::Toggler.new(sorts, orders)
|
10
|
-
toggler.to_a.should eq result
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'should toggle ascendance of email' do
|
14
|
-
orders = [['email', 'desc']]
|
15
|
-
sorts = [['email', 'asc']]
|
16
|
-
result = [['email', 'desc']]
|
17
|
-
|
18
|
-
toggler = Sorted::Toggler.new(sorts, orders)
|
19
|
-
toggler.to_a.should eq result
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should return both order params un-toggled with no sort param' do
|
23
|
-
orders = [['email', 'asc'], ['phone', 'asc']]
|
24
|
-
sorts = []
|
25
|
-
result = [['email', 'asc'], ['phone', 'asc']]
|
26
|
-
|
27
|
-
toggler = Sorted::Toggler.new(sorts, orders)
|
28
|
-
toggler.to_a.should eq result
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should toggle the email ascendance' do
|
32
|
-
orders = [['email', 'asc']]
|
33
|
-
sorts = [['email', 'asc'], ['phone', 'asc']]
|
34
|
-
result = [['email', 'desc'], ['phone', 'asc']]
|
35
|
-
|
36
|
-
toggler = Sorted::Toggler.new(sorts, orders)
|
37
|
-
toggler.to_a.should eq result
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'should toggle the email ascendance' do
|
41
|
-
orders = [['email', 'desc']]
|
42
|
-
sorts = [['email', 'asc'], ['phone', 'asc']]
|
43
|
-
result = [['email', 'desc'], ['phone', 'asc']]
|
44
|
-
|
45
|
-
toggler = Sorted::Toggler.new(sorts, orders)
|
46
|
-
toggler.to_a.should eq result
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'should toggle two 1..n sort values' do
|
50
|
-
orders = [['email', 'asc'], ['phone', 'asc']]
|
51
|
-
sorts = [['email', 'asc'], ['phone', 'asc']]
|
52
|
-
result = [['email', 'desc'], ['phone', 'desc']]
|
53
|
-
|
54
|
-
toggler = Sorted::Toggler.new(sorts, orders)
|
55
|
-
toggler.to_a.should eq result
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'should toggle based on sorts and not orders' do
|
59
|
-
orders = [['email', 'desc'], ['phone', 'desc']]
|
60
|
-
sorts = [['email', 'asc'], ['phone', 'asc']]
|
61
|
-
result = [['email', 'desc'], ['phone', 'desc']]
|
62
|
-
|
63
|
-
toggler = Sorted::Toggler.new(sorts, orders)
|
64
|
-
toggler.to_a.should eq result
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'should toggle based on sorts and not orders' do
|
68
|
-
orders = [['email', 'asc']]
|
69
|
-
sorts = [['name', 'asc']]
|
70
|
-
result = [['email', 'asc'], ['name', 'asc']]
|
71
|
-
|
72
|
-
toggler = Sorted::Toggler.new(sorts, orders)
|
73
|
-
toggler.to_a.should eq result
|
74
|
-
end
|
75
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Sorted::ViewHelpers::ActionView do
|
4
|
-
it 'should integrate with ActiveRecord::Base' do
|
5
|
-
ActionView::Base.send(:include, Sorted::ViewHelpers::ActionView)
|
6
|
-
ActionView::Base.new.should respond_to(:link_to_sorted)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
describe Sorted::ViewHelpers::ActionView::SortedViewHelper do
|
11
|
-
it 'should return the default sort order and preserve the existing params' do
|
12
|
-
order = :email
|
13
|
-
params = { page: 10 }
|
14
|
-
result = { page: 10, sort: 'email_asc' }
|
15
|
-
|
16
|
-
sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
|
17
|
-
sorter.params.should eq result
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'should only return the sorted css class if email has not yet been sorted' do
|
21
|
-
order = :email
|
22
|
-
params = {}
|
23
|
-
result = 'sorted'
|
24
|
-
|
25
|
-
sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
|
26
|
-
sorter.css.should eq result
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should only return the sorted css class if email has not yet been sorted' do
|
30
|
-
order = :email
|
31
|
-
params = { sort: 'email_asc' }
|
32
|
-
result = 'sorted asc'
|
33
|
-
|
34
|
-
sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
|
35
|
-
sorter.css.should eq result
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'should return the default order when params are empty' do
|
39
|
-
order = :email
|
40
|
-
result = { sort: 'email_asc' }
|
41
|
-
|
42
|
-
sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, {}
|
43
|
-
sorter.params.should eq result
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'should correctly toggle multiple params' do
|
47
|
-
order = 'email DESC, name DESC'
|
48
|
-
params = { sort: 'email_asc!name_asc' }
|
49
|
-
result = { sort: 'email_desc!name_desc' }
|
50
|
-
|
51
|
-
sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
|
52
|
-
sorter.params.should eq result
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'should have sort order over existing params' do
|
56
|
-
order = :email
|
57
|
-
params = { sort: 'name_asc' }
|
58
|
-
result = { sort: 'email_asc!name_asc' }
|
59
|
-
|
60
|
-
sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
|
61
|
-
sorter.params.should eq result
|
62
|
-
end
|
63
|
-
end
|