sorted 1.1.1 → 2.0.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.
- 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
|