sort_order 0.1.1
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.
- data/features/sort_order.feature +37 -0
- data/features/step_definitions/sort_order_steps.rb +50 -0
- data/features/support/env.rb +1 -0
- data/init.rb +4 -0
- data/lib/sort_order/column/direction.rb +31 -0
- data/lib/sort_order/column/field.rb +19 -0
- data/lib/sort_order/column.rb +40 -0
- data/lib/sort_order/columns.rb +62 -0
- data/lib/sort_order/controller_helper.rb +32 -0
- data/lib/sort_order/view_helper.rb +15 -0
- data/lib/sort_order.rb +17 -0
- data/rails/init.rb +1 -0
- metadata +73 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
Scenario: Sort Order
|
2
|
+
Given the following tokens: users.first_name, users.last_name asc, users.email 0
|
3
|
+
|
4
|
+
When I output each as sql
|
5
|
+
Then I should get the following list: users.first_name ASC, users.last_name ASC, users.email DESC
|
6
|
+
|
7
|
+
When I output the columns as sql
|
8
|
+
Then I should get the following string: users.first_name ASC, users.last_name ASC, users.email DESC
|
9
|
+
|
10
|
+
When I output the columns as sql (current only)
|
11
|
+
Then I should get the following string: users.first_name ASC
|
12
|
+
|
13
|
+
When I output each as a parameter
|
14
|
+
Then I should get the following list: first_name 1, last_name 1, email 0
|
15
|
+
|
16
|
+
When I output the columns as parameters
|
17
|
+
Then I should get the following hash: {:order=>["first_name 1", "last_name 1", "email 0"]}
|
18
|
+
|
19
|
+
When I output the columns as parameters (current only)
|
20
|
+
Then I should get the following hash: {:order=>"first_name 1"}
|
21
|
+
|
22
|
+
Scenario: Flipping Sort Orders!!!!
|
23
|
+
Given the following tokens: users.first_name, users.last_name asc, users.email 0
|
24
|
+
|
25
|
+
When I flip the current column
|
26
|
+
And I output the columns as sql (current only)
|
27
|
+
Then I should get the following string: users.first_name DESC
|
28
|
+
|
29
|
+
When I set the current column to: last_name 0
|
30
|
+
And I output the columns as sql (current only)
|
31
|
+
Then I should get the following string: users.last_name DESC
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
Given /^the following tokens: (.+)$/ do |tokens|
|
2
|
+
@sort_order = SortOrder.new(*tokens.split(', '))
|
3
|
+
end
|
4
|
+
|
5
|
+
|
6
|
+
When /^I output (.+) as (.+)$/ do |item, format|
|
7
|
+
@result = case [item, format]
|
8
|
+
when ['each', 'a parameter']
|
9
|
+
@sort_order.map(&:to_param)
|
10
|
+
when ['each', 'sql']
|
11
|
+
@sort_order.map(&:to_sql)
|
12
|
+
when ['the columns', 'sql']
|
13
|
+
@sort_order.to_sql
|
14
|
+
when ['the columns', 'sql (current only)']
|
15
|
+
@sort_order.to_sql(:current => true)
|
16
|
+
when ['the columns', 'parameters']
|
17
|
+
@sort_order.to_params
|
18
|
+
when ['the columns', 'parameters (current only)']
|
19
|
+
@sort_order.to_params(:current => true)
|
20
|
+
end
|
21
|
+
raise "No list set!" if @result.blank?
|
22
|
+
end
|
23
|
+
|
24
|
+
When /^I flip the current column$/ do
|
25
|
+
@sort_order.current.flip!
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
When /^I set the current column to: (.+)$/ do |token|
|
30
|
+
@sort_order.current = token
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
Then /^I should get the following list: (.+)$/ do |tokens|
|
36
|
+
@result.should == tokens.split(', ')
|
37
|
+
end
|
38
|
+
|
39
|
+
Then /^I should get the following string: (.+)$/ do |tokens|
|
40
|
+
@result.should == tokens
|
41
|
+
end
|
42
|
+
|
43
|
+
Then /^I should get the following hash$/ do |tokens|
|
44
|
+
@result.should == tokens.split(', ')
|
45
|
+
end
|
46
|
+
|
47
|
+
Then /^I should get the following hash: (.+)$/ do |hash|
|
48
|
+
@result.inspect.should == hash
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path( File.join( File.dirname(__FILE__), '..', '..', 'init' ) )
|
data/init.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module SortOrder
|
2
|
+
class Column
|
3
|
+
class Direction < String
|
4
|
+
|
5
|
+
def self.parse(value)
|
6
|
+
new((value.to_s.upcase == 'DESC' || value.to_s == '0') ? 'DESC' : 'ASC')
|
7
|
+
end
|
8
|
+
|
9
|
+
def label
|
10
|
+
"#{titleize}ending"
|
11
|
+
end
|
12
|
+
|
13
|
+
def asc?
|
14
|
+
self == 'ASC'
|
15
|
+
end
|
16
|
+
|
17
|
+
def desc?
|
18
|
+
!asc?
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_param(flip=false)
|
22
|
+
(flip ? desc? : asc?) ? '1' : '0'
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_sql(flip=false)
|
26
|
+
(flip ? desc? : asc?) ? 'ASC' : 'DESC'
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module SortOrder
|
2
|
+
class Column
|
3
|
+
|
4
|
+
attr_accessor :field, :direction
|
5
|
+
|
6
|
+
def self.parse(token)
|
7
|
+
token.is_a?(SortOrder::Column) ? token : new(*token.to_s.split(' '))
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(field, direction=nil)
|
11
|
+
@field, @direction = Field.new(field), Direction.parse(direction)
|
12
|
+
end
|
13
|
+
|
14
|
+
def label
|
15
|
+
field.label
|
16
|
+
end
|
17
|
+
|
18
|
+
def name
|
19
|
+
field.name
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_sql(options = {})
|
23
|
+
"#{field} #{direction.to_sql(options[:flip])}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_param(options = {})
|
27
|
+
"#{field.name} #{direction.to_param(options[:flip])}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def direction=(value)
|
31
|
+
@direction = Direction.parse(value)
|
32
|
+
end
|
33
|
+
|
34
|
+
def flip!
|
35
|
+
self.direction = direction.to_param(true)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module SortOrder
|
2
|
+
class Columns < Array
|
3
|
+
|
4
|
+
def initialize(*defaults)
|
5
|
+
super defaults.map { |d| Column.parse(d) }
|
6
|
+
raise SortOrder::NoDefaultColumnsError, "Please supply some default columns e.g. 'name', 'email desc', etc." if empty?
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_sql(options={})
|
10
|
+
options.delete(:current) ? current.to_sql(options) : map {|c| c.to_sql(options) }.join(', ')
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_params(options={})
|
14
|
+
{ :order => options.delete(:current) ? current.to_param(options) : map {|c| c.to_param(options) } }
|
15
|
+
end
|
16
|
+
|
17
|
+
def current
|
18
|
+
@current ||= first
|
19
|
+
end
|
20
|
+
|
21
|
+
def current=(token)
|
22
|
+
@current = merge(token)
|
23
|
+
end
|
24
|
+
|
25
|
+
def current?(other)
|
26
|
+
current == other
|
27
|
+
end
|
28
|
+
|
29
|
+
def column(token)
|
30
|
+
SortOrder::Column.parse(token)
|
31
|
+
end
|
32
|
+
|
33
|
+
def fields
|
34
|
+
map(&:field)
|
35
|
+
end
|
36
|
+
|
37
|
+
def <<(token)
|
38
|
+
merge token
|
39
|
+
return self
|
40
|
+
end
|
41
|
+
|
42
|
+
def merge(token)
|
43
|
+
new_col = column(token)
|
44
|
+
if old_col = find(new_col.name)
|
45
|
+
old_col.direction = new_col.direction
|
46
|
+
return old_col
|
47
|
+
else
|
48
|
+
self << new_col
|
49
|
+
return new_col
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def find(name)
|
54
|
+
super() {|c| c.name == name }
|
55
|
+
end
|
56
|
+
|
57
|
+
def include?(name)
|
58
|
+
find(name).present?
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module SortOrder
|
2
|
+
|
3
|
+
module ControllerHelper
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def default_sort_order(*args)
|
10
|
+
if args.any?
|
11
|
+
@@default_sort_order ||= {}
|
12
|
+
@@default_sort_order[name] = args
|
13
|
+
include InstanceMethods unless included_modules.include?(SortOrder::ControllerHelper::InstanceMethods)
|
14
|
+
helper_method :sort_order
|
15
|
+
end
|
16
|
+
@@default_sort_order[name]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module InstanceMethods
|
21
|
+
|
22
|
+
def sort_order
|
23
|
+
@sort_order ||= SortOrder.new *self.class.default_sort_order
|
24
|
+
end
|
25
|
+
|
26
|
+
private :sort_order
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
ActionController::Base.send :include, SortOrder::ControllerHelper
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SortOrder
|
2
|
+
module ViewHelper
|
3
|
+
|
4
|
+
def link_to_order_by(name, label=nil)
|
5
|
+
return "No call to default_sort_order in #{controller.controller_name} " unless respond_to?(:sort_order)
|
6
|
+
column = sort_order.find(name.to_s)
|
7
|
+
column = sort_order.current if sort_order.current?(column)
|
8
|
+
label ||= column.label
|
9
|
+
link_to label, {:order => column.to_param(:flip => true)}
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
ActionView::Base.send :include, SortOrder::ViewHelper
|
data/lib/sort_order.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module SortOrder
|
2
|
+
VERSION = '0.1.1'
|
3
|
+
|
4
|
+
def self.new *cols
|
5
|
+
Columns.new *cols
|
6
|
+
end
|
7
|
+
|
8
|
+
class NoDefaultColumnsError < StandardError; end
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'sort_order/column'
|
13
|
+
require 'sort_order/columns'
|
14
|
+
require 'sort_order/column/field'
|
15
|
+
require 'sort_order/column/direction'
|
16
|
+
require 'sort_order/view_helper' if defined?(ActionView::Base)
|
17
|
+
require 'sort_order/controller_helper' if defined?(ActionController::Base)
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../init')
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sort_order
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Alex Neill
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-05-21 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Manipulate column sort orders...
|
22
|
+
email: alex@rawnet.com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files: []
|
28
|
+
|
29
|
+
files:
|
30
|
+
- features/sort_order.feature
|
31
|
+
- features/step_definitions/sort_order_steps.rb
|
32
|
+
- features/support/env.rb
|
33
|
+
- init.rb
|
34
|
+
- lib/sort_order.rb
|
35
|
+
- lib/sort_order/column.rb
|
36
|
+
- lib/sort_order/column/direction.rb
|
37
|
+
- lib/sort_order/column/field.rb
|
38
|
+
- lib/sort_order/columns.rb
|
39
|
+
- lib/sort_order/controller_helper.rb
|
40
|
+
- lib/sort_order/view_helper.rb
|
41
|
+
- rails/init.rb
|
42
|
+
has_rdoc: true
|
43
|
+
homepage:
|
44
|
+
licenses: []
|
45
|
+
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
65
|
+
requirements: []
|
66
|
+
|
67
|
+
rubyforge_project: sort_order
|
68
|
+
rubygems_version: 1.3.6
|
69
|
+
signing_key:
|
70
|
+
specification_version: 2
|
71
|
+
summary: Manipulate column sort orders.
|
72
|
+
test_files: []
|
73
|
+
|