sorted 0.4.3 → 1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0262798feaab6b58860df0dd56c6eda414263e58
4
+ data.tar.gz: dde3ec5870721ddc59198f98132ea9ca03c7c763
5
+ SHA512:
6
+ metadata.gz: 8dc76069eeb8b172e3c6096588f9bc12404d44c747800fc3332f5e82344d476e1d22cab0a8bcc2110aa0c3292cc8c72fe3e6839cd28d0e92e2bb663696ab01d6
7
+ data.tar.gz: 18aec9e23e623f26be39632328d190c4213d7f960abb162b65337cfd2a9e7191775e303cee573ed63c471ae814b5368bd2d2d634c9ead24e8582df3c2db02b80
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml CHANGED
@@ -1,6 +1,8 @@
1
+ language: ruby
1
2
  rvm:
2
- - 1.8.7
3
3
  - 1.9.3
4
+ - 2.0.0
5
+ - jruby-19mode
4
6
  - ruby-head
5
7
 
6
8
  script: bundle exec rake spec
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :gemcutter
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in example.gemspec
4
4
  gemspec
data/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # sorted
2
+
3
+ [![Build Status](https://travis-ci.org/mynameisrufus/sorted.png?branch=master)](https://travis-ci.org/mynameisrufus/sorted)
4
+
5
+ Sorted is a simple object that will take an sql order string and a url
6
+ sort string to let you sort large datasets over many pages (using
7
+ [will_paginate](https://github.com/mislav/will_paginate) or
8
+ [kaminari](https://github.com/amatsuda/kaminari)) without losing state.
9
+
10
+ ### View
11
+
12
+ Generate a sorted link with the email attribute:
13
+
14
+ ```ruby
15
+ link_to_sorted "Email", :email
16
+ ```
17
+
18
+ Works the same as the `link_to` method except a second argument for the
19
+ sort attribute is needed.
20
+
21
+ ### Ruby 1.8.7 Rails 3.x
22
+
23
+ ```ruby
24
+ gem 'sorted', '~> 0.4.3'
25
+ ```
26
+
27
+ ### Model
28
+
29
+ Using the `sorted` method with the optional default order argument:
30
+
31
+ ```ruby
32
+ @users = User.sorted(params[:sort], "email ASC").page(params[:page])
33
+ ```
34
+
35
+ ### Rubies
36
+
37
+ * MRI 1.9.3, 2.0.0.
38
+ * JRuby 1.9 mode
39
+
40
+ ### ORMs
41
+
42
+ * ActiveRecord
43
+ * Mongoid
data/Rakefile CHANGED
@@ -7,14 +7,24 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
7
7
  spec.pattern = FileList['spec/**/*_spec.rb']
8
8
  end
9
9
 
10
- task :default => :spec
10
+ task :default => "spec:all"
11
11
 
12
12
  require 'rdoc/task'
13
13
  Rake::RDocTask.new do |rdoc|
14
14
  require 'sorted/version'
15
15
 
16
16
  rdoc.rdoc_dir = 'rdoc'
17
- rdoc.title = "kaminari #{Sorted::VERSION}"
17
+ rdoc.title = "sorted #{Sorted::VERSION}"
18
18
  rdoc.rdoc_files.include('README*')
19
19
  rdoc.rdoc_files.include('lib/**/*.rb')
20
20
  end
21
+
22
+ namespace :spec do
23
+ desc "Run Tests against all ORMs"
24
+ task :all do
25
+ %w(active_record_40 mongoid_30).each do |gemfile|
26
+ sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle --quiet"
27
+ sh "BUNDLE_GEMFILE='gemfiles/#{gemfile}.gemfile' bundle exec rake -t spec"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'railties', '>= 4.0.0'
4
+ gem 'activerecord', '>= 4.0.0', require: 'active_record'
5
+ gem 'rspec-rails', '>= 2.0'
6
+ gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
7
+ gem 'sqlite3', '>= 1.3.5', platforms: :ruby
8
+
9
+ gemspec path: '../'
@@ -0,0 +1,92 @@
1
+ PATH
2
+ remote: /Users/rufuspost/Projects/ruby/gems/sorted
3
+ specs:
4
+ sorted (1.0.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ actionpack (4.0.0)
10
+ activesupport (= 4.0.0)
11
+ builder (~> 3.1.0)
12
+ erubis (~> 2.7.0)
13
+ rack (~> 1.5.2)
14
+ rack-test (~> 0.6.2)
15
+ activemodel (4.0.0)
16
+ activesupport (= 4.0.0)
17
+ builder (~> 3.1.0)
18
+ activerecord (4.0.0)
19
+ activemodel (= 4.0.0)
20
+ activerecord-deprecated_finders (~> 1.0.2)
21
+ activesupport (= 4.0.0)
22
+ arel (~> 4.0.0)
23
+ activerecord-deprecated_finders (1.0.3)
24
+ activerecord-jdbc-adapter (1.3.3)
25
+ activerecord (>= 2.2)
26
+ activerecord-jdbcsqlite3-adapter (1.3.3)
27
+ activerecord-jdbc-adapter (~> 1.3.3)
28
+ jdbc-sqlite3 (~> 3.7.2)
29
+ activesupport (4.0.0)
30
+ i18n (~> 0.6, >= 0.6.4)
31
+ minitest (~> 4.2)
32
+ multi_json (~> 1.3)
33
+ thread_safe (~> 0.1)
34
+ tzinfo (~> 0.3.37)
35
+ arel (4.0.1)
36
+ atomic (1.1.14)
37
+ atomic (1.1.14-java)
38
+ builder (3.1.4)
39
+ diff-lcs (1.2.4)
40
+ erubis (2.7.0)
41
+ i18n (0.6.5)
42
+ jdbc-sqlite3 (3.7.2.1)
43
+ minitest (4.7.5)
44
+ multi_json (1.8.2)
45
+ rack (1.5.2)
46
+ rack-test (0.6.2)
47
+ rack (>= 1.0)
48
+ railties (4.0.0)
49
+ actionpack (= 4.0.0)
50
+ activesupport (= 4.0.0)
51
+ rake (>= 0.8.7)
52
+ thor (>= 0.18.1, < 2.0)
53
+ rake (10.1.0)
54
+ rspec (2.14.1)
55
+ rspec-core (~> 2.14.0)
56
+ rspec-expectations (~> 2.14.0)
57
+ rspec-mocks (~> 2.14.0)
58
+ rspec-core (2.14.6)
59
+ rspec-expectations (2.14.3)
60
+ diff-lcs (>= 1.1.3, < 2.0)
61
+ rspec-mocks (2.14.4)
62
+ rspec-rails (2.14.0)
63
+ actionpack (>= 3.0)
64
+ activesupport (>= 3.0)
65
+ railties (>= 3.0)
66
+ rspec-core (~> 2.14.0)
67
+ rspec-expectations (~> 2.14.0)
68
+ rspec-mocks (~> 2.14.0)
69
+ sqlite3 (1.3.8)
70
+ thor (0.18.1)
71
+ thread_safe (0.1.3)
72
+ atomic
73
+ thread_safe (0.1.3-java)
74
+ atomic
75
+ tzinfo (0.3.38)
76
+
77
+ PLATFORMS
78
+ java
79
+ ruby
80
+
81
+ DEPENDENCIES
82
+ actionpack (>= 3.0.0)
83
+ activerecord (>= 4.0.0)
84
+ activerecord-jdbcsqlite3-adapter
85
+ activesupport (>= 3.0.0)
86
+ bundler (>= 1.0.0)
87
+ railties (>= 4.0.0)
88
+ rake
89
+ rspec (>= 2.0.0)
90
+ rspec-rails (>= 2.0)
91
+ sorted!
92
+ sqlite3 (>= 1.3.5)
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'railties', '>= 4'
4
+ gem 'mongoid', '~> 4', github: 'mongoid/mongoid', require: 'mongoid'
5
+ gem 'rspec-rails', '>= 2.0'
6
+ gem 'origin'
7
+ gem 'moped'
8
+ gem 'nokogiri'
9
+ gem 'xpath'
10
+ gem 'mime-types'
11
+
12
+ gemspec path: '../'
@@ -0,0 +1,106 @@
1
+ GIT
2
+ remote: git://github.com/mongoid/mongoid.git
3
+ revision: 9b3bc1264032209b7a6c0e82d0ca656f401e476b
4
+ specs:
5
+ mongoid (4.0.0)
6
+ activemodel (~> 4.0.0)
7
+ moped (~> 2.0.beta3)
8
+ origin (~> 1.0)
9
+ tzinfo (~> 0.3.37)
10
+
11
+ PATH
12
+ remote: /Users/rufuspost/Projects/ruby/gems/sorted
13
+ specs:
14
+ sorted (1.0.0)
15
+
16
+ GEM
17
+ remote: https://rubygems.org/
18
+ specs:
19
+ actionpack (4.0.0)
20
+ activesupport (= 4.0.0)
21
+ builder (~> 3.1.0)
22
+ erubis (~> 2.7.0)
23
+ rack (~> 1.5.2)
24
+ rack-test (~> 0.6.2)
25
+ activemodel (4.0.0)
26
+ activesupport (= 4.0.0)
27
+ builder (~> 3.1.0)
28
+ activesupport (4.0.0)
29
+ i18n (~> 0.6, >= 0.6.4)
30
+ minitest (~> 4.2)
31
+ multi_json (~> 1.3)
32
+ thread_safe (~> 0.1)
33
+ tzinfo (~> 0.3.37)
34
+ atomic (1.1.14)
35
+ atomic (1.1.14-java)
36
+ bson (2.0.0.rc3)
37
+ bson (2.0.0.rc3-java)
38
+ builder (3.1.4)
39
+ diff-lcs (1.2.4)
40
+ erubis (2.7.0)
41
+ i18n (0.6.5)
42
+ mime-types (2.0)
43
+ mini_portile (0.5.2)
44
+ minitest (4.7.5)
45
+ moped (2.0.0.beta3)
46
+ bson (~> 2.0.0.rc3)
47
+ optionable (~> 0.1.1)
48
+ multi_json (1.8.2)
49
+ nokogiri (1.6.0)
50
+ mini_portile (~> 0.5.0)
51
+ nokogiri (1.6.0-java)
52
+ mini_portile (~> 0.5.0)
53
+ optionable (0.1.1)
54
+ origin (1.1.0)
55
+ rack (1.5.2)
56
+ rack-test (0.6.2)
57
+ rack (>= 1.0)
58
+ railties (4.0.0)
59
+ actionpack (= 4.0.0)
60
+ activesupport (= 4.0.0)
61
+ rake (>= 0.8.7)
62
+ thor (>= 0.18.1, < 2.0)
63
+ rake (10.1.0)
64
+ rspec (2.14.1)
65
+ rspec-core (~> 2.14.0)
66
+ rspec-expectations (~> 2.14.0)
67
+ rspec-mocks (~> 2.14.0)
68
+ rspec-core (2.14.7)
69
+ rspec-expectations (2.14.3)
70
+ diff-lcs (>= 1.1.3, < 2.0)
71
+ rspec-mocks (2.14.4)
72
+ rspec-rails (2.14.0)
73
+ actionpack (>= 3.0)
74
+ activesupport (>= 3.0)
75
+ railties (>= 3.0)
76
+ rspec-core (~> 2.14.0)
77
+ rspec-expectations (~> 2.14.0)
78
+ rspec-mocks (~> 2.14.0)
79
+ thor (0.18.1)
80
+ thread_safe (0.1.3)
81
+ atomic
82
+ thread_safe (0.1.3-java)
83
+ atomic
84
+ tzinfo (0.3.38)
85
+ xpath (2.0.0)
86
+ nokogiri (~> 1.3)
87
+
88
+ PLATFORMS
89
+ java
90
+ ruby
91
+
92
+ DEPENDENCIES
93
+ actionpack (>= 3.0.0)
94
+ activesupport (>= 3.0.0)
95
+ bundler (>= 1.0.0)
96
+ mime-types
97
+ mongoid (~> 4)!
98
+ moped
99
+ nokogiri
100
+ origin
101
+ railties (>= 4)
102
+ rake
103
+ rspec (>= 2.0.0)
104
+ rspec-rails (>= 2.0)
105
+ sorted!
106
+ xpath
@@ -1,13 +1,16 @@
1
- require 'active_record'
2
1
  require 'sorted'
2
+ require 'active_support/concern'
3
3
 
4
4
  module Sorted
5
5
  module Orms
6
6
  module ActiveRecord
7
- def self.included(base)
8
- def base.sorted(sort, default_order = nil)
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ def self.sorted(sort, default_order = nil)
9
11
  sorter = ::Sorted::Parser.new(sort, default_order)
10
- order sorter.to_sql
12
+ quoter = ->(frag) { connection.quote_column_name(frag) }
13
+ order sorter.to_sql(quoter)
11
14
  end
12
15
  end
13
16
  end
@@ -0,0 +1,18 @@
1
+ require 'sorted'
2
+ require 'active_support/concern'
3
+
4
+ module Sorted
5
+ module Orms
6
+ module Mongoid
7
+ extend ActiveSupport::Concern
8
+ SQL_TO_MONGO = { "asc" => 1, "desc" => -1 }
9
+
10
+ included do
11
+ def self.sorted(sort, default_order = nil)
12
+ sorter = ::Sorted::Parser.new(sort, default_order)
13
+ order_by sorter.to_hash.merge(sorter) { |key, val| SQL_TO_MONGO[val] }
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/sorted/parser.rb CHANGED
@@ -35,13 +35,16 @@ module Sorted
35
35
  end
36
36
  end.compact
37
37
  end
38
-
38
+
39
39
  def to_hash
40
40
  array.inject({}){|h,a| h.merge(Hash[a[0],a[1]])}
41
41
  end
42
-
43
- def to_sql
44
- array.map{|a| "#{a[0]} #{a[1].upcase}" }.join(', ')
42
+
43
+ def to_sql(quoter = ->(frag) { frag })
44
+ array.map do |a|
45
+ column = a[0].split('.').map{ |frag| quoter.call(frag) }.join('.')
46
+ "#{column} #{a[1].upcase}"
47
+ end.join(', ')
45
48
  end
46
49
 
47
50
  def to_s
@@ -51,12 +54,12 @@ module Sorted
51
54
  def to_a
52
55
  array
53
56
  end
54
-
57
+
55
58
  def toggle
56
59
  @array = Toggler.new(sorts, orders).to_a
57
60
  self
58
61
  end
59
-
62
+
60
63
  def reset
61
64
  @array = default
62
65
  self
@@ -3,10 +3,18 @@ require 'sorted'
3
3
  module Sorted
4
4
  class Railtie < Rails::Railtie
5
5
  initializer "sorted.configure" do |app|
6
- ActiveSupport.on_load :active_record do
7
- require 'sorted/orms/active_record'
8
- include Sorted::Orms::ActiveRecord
6
+ if defined? ::ActiveRecord
7
+ ActiveSupport.on_load :active_record do
8
+ require 'sorted/orms/active_record'
9
+ include Sorted::Orms::ActiveRecord
10
+ end
9
11
  end
12
+
13
+ if defined? ::Mongoid
14
+ require 'sorted/orms/mongoid'
15
+ ::Mongoid::Document.send :include, Sorted::Orms::Mongoid
16
+ end
17
+
10
18
  ActiveSupport.on_load :action_view do
11
19
  require 'sorted/view_helpers/action_view'
12
20
  include Sorted::ViewHelpers::ActionView
@@ -1,3 +1,3 @@
1
1
  module Sorted
2
- VERSION = "0.4.3"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -54,7 +54,32 @@ module Sorted
54
54
 
55
55
  sorter = SortedViewHelper.new(order, ((request.get? && !params.nil?) ? params.dup : {}))
56
56
  options[:class] = [options[:class], sorter.css].join(' ').strip
57
- link_to(sorter.params, options, html_options, &block)
57
+ link_to(url_for(sorter.params), options, html_options, &block)
58
+ end
59
+
60
+ # Convenience method for quickly spitting out a sorting menu.
61
+ #
62
+ # ==== Examples
63
+ #
64
+ # Basic usage
65
+ #
66
+ # sort_by :first_name, :last_name
67
+ #
68
+ # To provide a string to use instead of a column name, pass an array composed
69
+ # of your label string and the column name (symbol):
70
+ #
71
+ # sortable_by :author_name, :title, ["Date of Publication", :published_at]
72
+ #
73
+ def sortable_by(*columns)
74
+ links = content_tag :span, "Sort by: "
75
+ columns.each do |c|
76
+ if c.is_a? Array
77
+ links += link_to_sorted(c[0],c[1].to_sym)
78
+ else
79
+ links += link_to_sorted(c.to_s.titleize, c.to_sym)
80
+ end
81
+ end
82
+ content_tag :div, links, class: 'sortable'
58
83
  end
59
84
  end
60
85
  end
data/sorted.gemspec CHANGED
@@ -5,19 +5,21 @@ Gem::Specification.new do |s|
5
5
  s.name = "sorted"
6
6
  s.version = Sorted::VERSION
7
7
  s.platform = Gem::Platform::RUBY
8
- s.authors = ["Rufus Post"]
9
- s.email = ["rufuspost@gmail.com"]
8
+ s.authors = ["Rufus Post", "Daniel Leavitt"]
9
+ s.email = ["rufuspost@gmail.com", "daniel.leavitt@gmail.com"]
10
10
  s.homepage = "http://rubygems.org/gems/sorted"
11
- s.summary = "sort data with a database"
12
- s.description = "lets you sort large data sets using view helpers and a scope"
11
+ s.summary = %q{Data sorting library}
12
+ s.description = %q{Allows you to sort large datasets over many pages, without losing state.}
13
+ s.license = "MIT"
13
14
 
14
15
  s.required_rubygems_version = ">= 1.3.6"
15
16
  s.rubyforge_project = "sorted"
16
17
 
18
+ s.add_development_dependency "rake", ">= 0"
17
19
  s.add_development_dependency "bundler", ">= 1.0.0"
18
- s.add_development_dependency "rails", ">= 3.1.2"
19
20
  s.add_development_dependency "rspec", ">= 2.0.0"
20
- s.add_development_dependency "sqlite3", ">= 1.3.5"
21
+ s.add_development_dependency "activesupport", ">= 3.0.0"
22
+ s.add_development_dependency "actionpack", ">= 3.0.0"
21
23
 
22
24
  s.files = `git ls-files`.split("\n")
23
25
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
@@ -1,27 +1,27 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Sorted::Orms::ActiveRecord do
4
- ActiveRecord::Base.send(:include, Sorted::Orms::ActiveRecord)
5
-
6
- class SortedActiveRecordTest < ActiveRecord::Base
7
- establish_connection :adapter => 'sqlite3', :database => '/tmp/foobar.db'
3
+ if defined? ActiveRecord
4
+ describe Sorted::Orms::ActiveRecord do
5
+ ActiveRecord::Base.send(:include, Sorted::Orms::ActiveRecord)
8
6
 
9
- connection.create_table table_name, :force => true do |t|
10
- t.string :name
11
- end
7
+ class SortedActiveRecordTest < ActiveRecord::Base
8
+ establish_connection adapter: 'sqlite3', database: ':memory:'
12
9
 
13
- scope :page, lambda {
14
- limit(50)
15
- }
16
- end
10
+ connection.create_table table_name, force: true do |t|
11
+ t.string :name
12
+ end
17
13
 
18
- it "should integrate with ActiveRecord::Base" do
19
- SortedActiveRecordTest.should respond_to(:sorted)
20
- end
14
+ scope :page, -> { limit(50) }
15
+ end
21
16
 
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
17
+ it "should integrate with ActiveRecord::Base" do
18
+ SortedActiveRecordTest.should respond_to(:sorted)
19
+ end
20
+
21
+ it "should play nice with other scopes" do
22
+ sql = "SELECT \"sorted_active_record_tests\".* FROM \"sorted_active_record_tests\" WHERE \"sorted_active_record_tests\".\"name\" = 'bob' ORDER BY \"name\" ASC LIMIT 50"
23
+ SortedActiveRecordTest.where(:name => 'bob').page.sorted(nil, 'name ASC').to_sql.should == sql
24
+ SortedActiveRecordTest.page.sorted(nil, 'name ASC').where(:name => 'bob').to_sql.should == sql
25
+ end
26
26
  end
27
27
  end
@@ -0,0 +1,32 @@
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
@@ -61,13 +61,31 @@ describe Sorted::Parser, "params parsing" do
61
61
  end
62
62
 
63
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
+
64
82
  it "should return an sql sort string" do
65
83
  sort = "email_desc!name_desc"
66
84
  order = "email ASC, phone ASC, name DESC"
67
- result = "email DESC, name DESC, phone ASC"
85
+ result = "`email` DESC, `name` DESC, `phone` ASC"
68
86
 
69
87
  sorter = Sorted::Parser.new(sort, order)
70
- sorter.to_sql.should eq result
88
+ sorter.to_sql(quoter).should eq result
71
89
  end
72
90
 
73
91
  it "should return an hash" do
@@ -91,9 +109,9 @@ describe Sorted::Parser, "return types" do
91
109
  it "sql injection using order by clause should not work" do
92
110
  sort = "(case+when+((ASCII(SUBSTR((select+table_name+from+all_tables+where+rownum%3d1),1))>%3D128))+then+id+else+something+end)"
93
111
  order = "email ASC, phone ASC, name DESC"
94
- result = "email ASC, phone ASC, name DESC"
112
+ result = "`email` ASC, `phone` ASC, `name` DESC"
95
113
 
96
114
  sorter = Sorted::Parser.new(sort, order)
97
- sorter.to_sql.should eq result
115
+ sorter.to_sql(quoter).should eq result
98
116
  end
99
117
  end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,16 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ begin
5
+ require 'rails'
6
+ rescue LoadError
7
+ end
8
+
9
+ require 'bundler/setup'
10
+ Bundler.require
11
+
3
12
  require 'sorted'
13
+ require 'sorted/orms/mongoid'
4
14
  require 'sorted/orms/active_record'
5
15
  require 'sorted/view_helpers/action_view'
6
16
  require 'rspec'
metadata CHANGED
@@ -1,75 +1,108 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorted
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Rufus Post
8
+ - Daniel Leavitt
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-03 00:00:00.000000000 Z
12
+ date: 2013-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: bundler
16
- requirement: &70131329800380 !ruby/object:Gem::Requirement
17
- none: false
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
18
17
  requirements:
19
- - - ! '>='
18
+ - - '>='
20
19
  - !ruby/object:Gem::Version
21
- version: 1.0.0
20
+ version: '0'
22
21
  type: :development
23
22
  prerelease: false
24
- version_requirements: *70131329800380
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '>='
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
25
28
  - !ruby/object:Gem::Dependency
26
- name: rails
27
- requirement: &70131329799320 !ruby/object:Gem::Requirement
28
- none: false
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
29
31
  requirements:
30
- - - ! '>='
32
+ - - '>='
31
33
  - !ruby/object:Gem::Version
32
- version: 3.1.2
34
+ version: 1.0.0
33
35
  type: :development
34
36
  prerelease: false
35
- version_requirements: *70131329799320
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: 1.0.0
36
42
  - !ruby/object:Gem::Dependency
37
43
  name: rspec
38
- requirement: &70131329817920 !ruby/object:Gem::Requirement
39
- none: false
44
+ requirement: !ruby/object:Gem::Requirement
40
45
  requirements:
41
- - - ! '>='
46
+ - - '>='
42
47
  - !ruby/object:Gem::Version
43
48
  version: 2.0.0
44
49
  type: :development
45
50
  prerelease: false
46
- version_requirements: *70131329817920
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: 2.0.0
56
+ - !ruby/object:Gem::Dependency
57
+ name: activesupport
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 3.0.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 3.0.0
47
70
  - !ruby/object:Gem::Dependency
48
- name: sqlite3
49
- requirement: &70131329816300 !ruby/object:Gem::Requirement
50
- none: false
71
+ name: actionpack
72
+ requirement: !ruby/object:Gem::Requirement
51
73
  requirements:
52
- - - ! '>='
74
+ - - '>='
53
75
  - !ruby/object:Gem::Version
54
- version: 1.3.5
76
+ version: 3.0.0
55
77
  type: :development
56
78
  prerelease: false
57
- version_requirements: *70131329816300
58
- description: lets you sort large data sets using view helpers and a scope
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: 3.0.0
84
+ description: Allows you to sort large datasets over many pages, without losing state.
59
85
  email:
60
86
  - rufuspost@gmail.com
87
+ - daniel.leavitt@gmail.com
61
88
  executables: []
62
89
  extensions: []
63
90
  extra_rdoc_files: []
64
91
  files:
65
92
  - .gitignore
93
+ - .rspec
66
94
  - .travis.yml
67
95
  - Gemfile
68
96
  - LICENSE
69
- - README.rdoc
97
+ - README.md
70
98
  - Rakefile
99
+ - gemfiles/active_record_40.gemfile
100
+ - gemfiles/active_record_40.gemfile.lock
101
+ - gemfiles/mongoid_30.gemfile
102
+ - gemfiles/mongoid_30.gemfile.lock
71
103
  - lib/sorted.rb
72
104
  - lib/sorted/orms/active_record.rb
105
+ - lib/sorted/orms/mongoid.rb
73
106
  - lib/sorted/parser.rb
74
107
  - lib/sorted/railtie.rb
75
108
  - lib/sorted/toggler.rb
@@ -77,35 +110,33 @@ files:
77
110
  - lib/sorted/view_helpers/action_view.rb
78
111
  - sorted.gemspec
79
112
  - spec/sorted/orms/active_record_spec.rb
113
+ - spec/sorted/orms/mongoid_spec.rb
80
114
  - spec/sorted/parser_spec.rb
81
115
  - spec/sorted/toggler_spec.rb
82
116
  - spec/sorted/view_helpers/action_view_spec.rb
83
117
  - spec/spec_helper.rb
84
118
  homepage: http://rubygems.org/gems/sorted
85
- licenses: []
119
+ licenses:
120
+ - MIT
121
+ metadata: {}
86
122
  post_install_message:
87
123
  rdoc_options: []
88
124
  require_paths:
89
125
  - lib
90
126
  required_ruby_version: !ruby/object:Gem::Requirement
91
- none: false
92
127
  requirements:
93
- - - ! '>='
128
+ - - '>='
94
129
  - !ruby/object:Gem::Version
95
130
  version: '0'
96
- segments:
97
- - 0
98
- hash: -4246959904636690833
99
131
  required_rubygems_version: !ruby/object:Gem::Requirement
100
- none: false
101
132
  requirements:
102
- - - ! '>='
133
+ - - '>='
103
134
  - !ruby/object:Gem::Version
104
135
  version: 1.3.6
105
136
  requirements: []
106
137
  rubyforge_project: sorted
107
- rubygems_version: 1.8.11
138
+ rubygems_version: 2.0.0
108
139
  signing_key:
109
- specification_version: 3
110
- summary: sort data with a database
140
+ specification_version: 4
141
+ summary: Data sorting library
111
142
  test_files: []
data/README.rdoc DELETED
@@ -1,27 +0,0 @@
1
- = sorted
2
-
3
- Sorted is a simple object that will take an sql order string and a url
4
- sort string to let you sort large datasets over many pages (using
5
- {will_paginate}[http://github.com/mislav/will_paginatea] or
6
- {kaminari}[https://github.com/amatsuda/kaminari]) without loosing state.
7
-
8
- {<img src="https://secure.travis-ci.org/mynameisrufus/sorted.png" />}[http://travis-ci.org/mynameisrufus/sorted]
9
-
10
- === Gemfile
11
-
12
- gem 'sorted', '~> 0.4.3'
13
-
14
- === View
15
-
16
- Generate a sorted link with the email attribute:
17
-
18
- link_to_sorted "Email", :email
19
-
20
- Works the same as the +link_to+ method except a second argument for the
21
- sort attribute is needed.
22
-
23
- === Model
24
-
25
- Using the +sorted+ method with the optional default order argument:
26
-
27
- @users = User.sorted(params[:sort], "email ASC").page(params[:page])