sorted-activerecord 0.1.1 → 0.1.2

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 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