sorted-activerecord 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc58014f05b2a80f9238bb33d98e76e3dec941c5
4
- data.tar.gz: 1ead6ecd557dd19f0c3a03ee11a154fc90c86665
3
+ metadata.gz: dad88b26febe4a092e3832ecf4a981590629768e
4
+ data.tar.gz: 59a3842b4e0a927c118054c0bca71cdb1259bbc5
5
5
  SHA512:
6
- metadata.gz: f7a8c3e36ddc370b777204b0eb58fbcc3851d59d4532c8b3295c939fc5f4dac841a3269677e6d6cdaca959e597b0abf388feec5ae1e72bcb298bd737d2c84317
7
- data.tar.gz: 1379753406f3ea0d17e7046487417b8572d13bb899e7aadfb5a15d0fd433dee73010a8451e608847b74dcb097b8ec09cd3bb9cb5511f477aee1ec2f51c7691b3
6
+ metadata.gz: 5384beb8cc7de376e714fc8d5fcb8cc9feb75d354fa820ee2373fccb6d80a879b2418691c5ddc5a36d47969f87f0507ae39c7977e11c99b97a80c3900abf1671
7
+ data.tar.gz: 922d9586a74b8345f5011fe48c8f5233cd05a78b682faf835e87c6344a9115da962d69360aa0eed9fbfe7abd20a6a5b5444402cfec5e651afcb20b6072b44216
data/Rakefile CHANGED
@@ -9,4 +9,4 @@ end
9
9
 
10
10
  RuboCop::RakeTask.new
11
11
 
12
- task default: %w(rubocop spec)
12
+ task default: %w(spec rubocop)
@@ -8,6 +8,7 @@ module Sorted
8
8
  attr_reader :set
9
9
 
10
10
  def initialize(sort: [], order: [], whitelist: [])
11
+ @return_hash = true
11
12
  uri = parse_sort(sort)
12
13
  if whitelist.length > 0
13
14
  uri = ::Sorted::Set.new(uri.select { |o| whitelist.include?(o[0]) })
@@ -32,6 +33,7 @@ module Sorted
32
33
  return ::Sorted::Set.new if order.nil?
33
34
  case order.class.name
34
35
  when 'String'
36
+ @return_hash = false
35
37
  ::Sorted::SQLQuery.parse(order)
36
38
  when 'Array'
37
39
  parse(order)
@@ -46,6 +48,7 @@ module Sorted
46
48
  when 'Hash'
47
49
  memo = memo + parse(value.to_a)
48
50
  when 'String'
51
+ @return_hash = false
49
52
  memo = memo + ::Sorted::SQLQuery.parse(value)
50
53
  when 'Symbol'
51
54
  memo = memo << [value.to_s, 'asc']
@@ -63,6 +66,10 @@ module Sorted
63
66
  def to_hash
64
67
  @set.to_a.inject({}) { |a, e| a.merge(Hash[e[0].to_sym, e[1].to_sym]) }
65
68
  end
69
+
70
+ def to_sql
71
+ @return_hash ? to_hash : ::Sorted::SQLQuery.encode(@set)
72
+ end
66
73
  end
67
74
  end
68
75
  end
@@ -1,6 +1,6 @@
1
1
  require 'active_record'
2
2
  require 'active_support/concern'
3
- require 'sorted/activerecord/builder'
3
+ require 'sorted/active_record/builder'
4
4
 
5
5
  module Sorted
6
6
  module ActiveRecord
@@ -12,14 +12,14 @@ module Sorted
12
12
  builder = ::Sorted::ActiveRecord::Builder.new(sort: sort,
13
13
  order: order,
14
14
  whitelist: whitelist)
15
- order(builder.to_hash)
15
+ order(builder.to_sql)
16
16
  end
17
17
 
18
18
  def self.resorted(sort: [], order: [], whitelist: [])
19
19
  builder = ::Sorted::ActiveRecord::Builder.new(sort: sort,
20
20
  order: order,
21
21
  whitelist: whitelist)
22
- reorder(builder.to_hash)
22
+ reorder(builder.to_sql)
23
23
  end
24
24
  end
25
25
  end
@@ -1,11 +1,11 @@
1
1
  require 'rails'
2
2
  require 'rails/railtie'
3
- require 'sorted/activerecord/helper'
3
+ require 'sorted/active_record/helper'
4
4
 
5
5
  module Sorted
6
6
  module ActiveRecord
7
7
  class Railtie < ::Rails::Railtie
8
- config.after_initialize do |_app|
8
+ initializer 'sorted' do |_app|
9
9
  ActiveSupport.on_load(:active_record) do
10
10
  include Sorted::ActiveRecord::Helper
11
11
  end
@@ -0,0 +1,5 @@
1
+ module Sorted
2
+ module ActiveRecord
3
+ VERSION = '0.1.2'
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ begin
2
+ require 'rails'
3
+ rescue LoadError
4
+ #do nothing
5
+ end
6
+
7
+ require 'sorted/active_record/version'
8
+ require 'sorted/active_record/railtie' if defined?(Rails)
@@ -1,2 +1 @@
1
- require 'sorted/activerecord/version'
2
- require 'sorted/activerecord/railtie' if defined?(Rails::Railtie)
1
+ require 'sorted/active_record'
@@ -1,11 +1,11 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'sorted/activerecord/version'
4
+ require 'sorted/active_record/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'sorted-activerecord'
8
- spec.version = Sorted::Activerecord::VERSION
8
+ spec.version = Sorted::ActiveRecord::VERSION
9
9
  spec.authors = ['Rufus Post']
10
10
  spec.email = ['Rufus.Post@team.telstra.com']
11
11
  spec.summary = 'Activerecord scoped for sorted.'
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+ require 'active_record'
3
+ require 'sorted/active_record/helper'
4
+
5
+ ActiveRecord::Base.send(:include, Sorted::ActiveRecord::Helper)
6
+
7
+ describe Sorted::ActiveRecord do
8
+ class Post < ActiveRecord::Base
9
+ establish_connection adapter: 'sqlite3', database: ':memory:'
10
+
11
+ connection.create_table table_name, force: true do |t|
12
+ t.string :name
13
+ end
14
+
15
+ belongs_to :user
16
+
17
+ scope :page, -> { limit(50) }
18
+ end
19
+
20
+ class User < ActiveRecord::Base
21
+ establish_connection adapter: 'sqlite3', database: ':memory:'
22
+
23
+ connection.create_table table_name, force: true do |t|
24
+ t.string :name
25
+ end
26
+
27
+ has_many :posts
28
+
29
+ scope :page, -> { limit(50) }
30
+ end
31
+
32
+ let(:subject) { Post }
33
+
34
+ it 'should integrate with ActiveRecord::Base sorted' do
35
+ expect(subject.respond_to?(:sorted)).to eq(true)
36
+ end
37
+
38
+ it 'should integrate with ActiveRecord::Base resorted' do
39
+ expect(subject.respond_to?(:resorted)).to eq(true)
40
+ end
41
+
42
+ it 'should integrate with ActiveRecord::Relation sorted' do
43
+ expect(subject.references(:user).includes(:user).respond_to?(:sorted)).to eq(true)
44
+ end
45
+
46
+ it 'should allow symbols for order' do
47
+ expected = subject.order(:created_at).to_sql
48
+ actual = subject.sorted(order: [:created_at]).to_sql
49
+ expect(actual).to match(expected)
50
+ end
51
+
52
+ it 'should allow strings for order' do
53
+ expected = subject.order('created_at').to_sql
54
+ actual = subject.sorted(order: ['created_at']).to_sql
55
+ expect(actual).to match(expected)
56
+ end
57
+
58
+ it 'should allow hash as order' do
59
+ expected = subject.order({ created_at: :desc }).to_sql
60
+ actual = subject.sorted(order: [{ created_at: :desc }]).to_sql
61
+ expect(actual).to match(expected)
62
+ end
63
+
64
+ it 'should allow hash as sort' do
65
+ expected = subject.order({ created_at: :desc }).to_sql
66
+ actual = subject.sorted(sort: [{ created_at: :desc }]).to_sql
67
+ expect(actual).to match(expected)
68
+ end
69
+
70
+ it 'should allow symbols and hash as order' do
71
+ expected = subject.order(:orders_count, { created_at: :desc }).to_sql
72
+ actual = subject.sorted(sort: [:orders_count, { created_at: :desc }]).to_sql
73
+ expect(actual).to match(expected)
74
+ end
75
+
76
+ it 'should allow sql' do
77
+ expected = subject.order('orders_count ASC, created_at DESC').to_sql
78
+ actual = subject.sorted(order: 'orders_count ASC, created_at DESC').to_sql
79
+ expect(actual).to match(expected)
80
+ end
81
+
82
+ it 'should allow uri' do
83
+ expected = subject.order(orders_count: :asc, created_at: :desc).to_sql
84
+ actual = subject.sorted(sort: 'orders_count_asc!created_at_desc').to_sql
85
+ expect(actual).to match(expected)
86
+ end
87
+
88
+ it 'should allow an array of sql' do
89
+ expected = subject.order('orders_count ASC', 'created_at DESC').to_sql
90
+ actual = subject.sorted(order: ['orders_count ASC', 'created_at DESC']).to_sql
91
+ expect(actual).to match(expected)
92
+ end
93
+
94
+ it 'should play nice with other scopes' do
95
+ expected = subject.where(name: 'bob').page.order('name ASC').to_sql
96
+ actual = subject.where(name: 'bob').page.sorted(order: 'name ASC').to_sql
97
+ expect(actual).to match(expected)
98
+ end
99
+
100
+ it 'should override the provided order' do
101
+ expected = subject.page.where(name: 'bob').order(:id).order('name DESC').reorder('name ASC').to_sql
102
+ actual = subject.page.where(name: 'bob').order(:id).sorted(order: 'name DESC').resorted(order: 'name ASC').to_sql
103
+ expect(actual).to match(expected)
104
+ end
105
+
106
+ it 'should work with whitelist' do
107
+ expected = subject.order(created_at: :desc).to_sql
108
+ expect(subject.sorted(sort: 'orders_count_asc!created_at_desc',
109
+ whitelist: %(created_at)).to_sql).to match(expected)
110
+ end
111
+
112
+ it 'should not parse custom order strings' do
113
+ relation = subject.references(:user).includes(:user)
114
+ expected = relation.order('users.name ASC').to_sql
115
+ actual = relation.sorted(order: 'users.name ASC').to_sql
116
+ expect(actual).to match(expected)
117
+ end
118
+
119
+ it 'should not raise error with nil value' do
120
+ expect(-> { subject.sorted(sort: nil) }).to_not raise_error
121
+ end
122
+
123
+ it 'should not raise error with empty string' do
124
+ expect(-> { subject.sorted(sort: '') }).to_not raise_error
125
+ end
126
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorted-activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rufus Post
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-01 00:00:00.000000000 Z
11
+ date: 2015-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -166,13 +166,14 @@ files:
166
166
  - LICENSE.txt
167
167
  - README.md
168
168
  - Rakefile
169
+ - lib/sorted/active_record.rb
170
+ - lib/sorted/active_record/builder.rb
171
+ - lib/sorted/active_record/helper.rb
172
+ - lib/sorted/active_record/railtie.rb
173
+ - lib/sorted/active_record/version.rb
169
174
  - lib/sorted/activerecord.rb
170
- - lib/sorted/activerecord/builder.rb
171
- - lib/sorted/activerecord/helper.rb
172
- - lib/sorted/activerecord/railtie.rb
173
- - lib/sorted/activerecord/version.rb
174
175
  - sorted-activerecord.gemspec
175
- - spec/sorted/activerecord_spec.rb
176
+ - spec/sorted/active_record_spec.rb
176
177
  - spec/spec_helper.rb
177
178
  homepage: ''
178
179
  licenses:
@@ -199,5 +200,5 @@ signing_key:
199
200
  specification_version: 4
200
201
  summary: Activerecord scoped for sorted.
201
202
  test_files:
202
- - spec/sorted/activerecord_spec.rb
203
+ - spec/sorted/active_record_spec.rb
203
204
  - spec/spec_helper.rb
@@ -1,5 +0,0 @@
1
- module Sorted
2
- module Activerecord
3
- VERSION = '0.1.1'
4
- end
5
- end
@@ -1,91 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_record'
3
- require 'sorted/activerecord/helper'
4
-
5
- ActiveRecord::Base.send(:include, Sorted::ActiveRecord::Helper)
6
-
7
- describe Sorted::ActiveRecord do
8
- class SortedActiveRecordTest < ActiveRecord::Base
9
- establish_connection adapter: 'sqlite3', database: ':memory:'
10
-
11
- connection.create_table table_name, force: true do |t|
12
- t.string :name
13
- end
14
-
15
- scope :page, -> { limit(50) }
16
- end
17
-
18
- let(:subject) { SortedActiveRecordTest }
19
-
20
- it 'should integrate with ActiveRecord::Base' do
21
- expect(subject.respond_to?(:sorted)).to eq(true)
22
- expect(subject.respond_to?(:resorted)).to eq(true)
23
- end
24
-
25
- it 'should allow symbols and strings order' do
26
- order_by = 'ORDER BY "sorted_active_record_tests"."created_at" ASC'
27
- expect(subject.sorted(order: [:created_at]).to_sql).to match(order_by)
28
- expect(subject.sorted(order: ['created_at']).to_sql).to match(order_by)
29
- end
30
-
31
- it 'should allow symbols and strings as sort' do
32
- order_by = 'ORDER BY "sorted_active_record_tests"."created_at" ASC'
33
- expect(subject.sorted(sort: [:created_at]).to_sql).to match(order_by)
34
- expect(subject.sorted(sort: ['created_at']).to_sql).to match(order_by)
35
- end
36
-
37
- it 'should allow hash as order' do
38
- order_by = 'ORDER BY "sorted_active_record_tests"."created_at" DESC'
39
- expect(subject.sorted(order: [{ created_at: :desc }]).to_sql).to match(order_by)
40
- end
41
-
42
- it 'should allow hash as sort' do
43
- order_by = 'ORDER BY "sorted_active_record_tests"."created_at" DESC'
44
- expect(subject.sorted(sort: [{ created_at: :desc }]).to_sql).to match(order_by)
45
- end
46
-
47
- it 'should allow symbols and hash as order' do
48
- order_by = 'ORDER BY "sorted_active_record_tests"."orders_count" ASC, "sorted_active_record_tests"."created_at" DESC'
49
- expect(subject.sorted(order: [:orders_count, { created_at: :desc }]).to_sql).to match(order_by)
50
- end
51
-
52
- it 'should allow sql' do
53
- order_by = 'ORDER BY "sorted_active_record_tests"."orders_count" ASC, "sorted_active_record_tests"."created_at" DESC'
54
- expect(subject.sorted(order: 'orders_count ASC, created_at DESC').to_sql).to match(order_by)
55
- end
56
-
57
- it 'should allow uri' do
58
- order_by = 'ORDER BY "sorted_active_record_tests"."orders_count" ASC, "sorted_active_record_tests"."created_at" DESC'
59
- expect(subject.sorted(sort: 'orders_count_asc!created_at_desc').to_sql).to match(order_by)
60
- end
61
-
62
- it 'should allow an array of sql' do
63
- order_by = 'ORDER BY "sorted_active_record_tests"."orders_count" ASC, "sorted_active_record_tests"."created_at" DESC'
64
- expect(subject.sorted(order: ['orders_count ASC', 'created_at DESC']).to_sql).to match(order_by)
65
- end
66
-
67
- it 'should play nice with other scopes' do
68
- sql = "SELECT \"sorted_active_record_tests\".* FROM \"sorted_active_record_tests\" WHERE \"sorted_active_record_tests\".\"name\" = 'bob' ORDER BY \"sorted_active_record_tests\".\"name\" ASC LIMIT 50"
69
- expect(subject.where(name: 'bob').page.sorted(order: 'name ASC').to_sql).to eq(sql)
70
- expect(subject.page.sorted(order: 'name ASC').where(name: 'bob').to_sql).to eq(sql)
71
- end
72
-
73
- it 'should override the provided order' do
74
- sql = "SELECT \"sorted_active_record_tests\".* FROM \"sorted_active_record_tests\" WHERE \"sorted_active_record_tests\".\"name\" = 'bob' ORDER BY \"sorted_active_record_tests\".\"name\" ASC LIMIT 50"
75
- expect(subject.page.where(name: 'bob').order(:id).sorted(order: 'name DESC').resorted(order: 'name ASC').to_sql).to eq(sql)
76
- end
77
-
78
- it 'should work with whitelist' do
79
- order_by = 'ORDER BY "sorted_active_record_tests"."created_at" DESC'
80
- expect(subject.sorted(sort: 'orders_count_asc!created_at_desc',
81
- whitelist: %(created_at)).to_sql).to match(order_by)
82
- end
83
-
84
- it 'should not raise error with nil value' do
85
- expect(-> { subject.sorted(sort: nil) }).to_not raise_error
86
- end
87
-
88
- it 'should not raise error with empty string' do
89
- expect(-> { subject.sorted(sort: '') }).to_not raise_error
90
- end
91
- end