sorted 2.1.2 → 2.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fce640d4b8cfd9423a8aaaf498818a724d1fc008
4
- data.tar.gz: eaabb0713590702c42d83c4f9ad6288b2955723a
3
+ metadata.gz: 38dd0916f6d792b758402c94839d2277b863dcf9
4
+ data.tar.gz: 669640e3a8adf55ad839b0218f0082319c4b8e24
5
5
  SHA512:
6
- metadata.gz: 2cf3f307a7bdd63db2ba1b17c4c8c4f1c701b5ebd9f1f5393027483386da049c8c3cffa27f7ff8a5389d6f8a6bc77319c73b8ceeed93bf4986f0974909d302e5
7
- data.tar.gz: b7e9e286b1b8802aad1e010f9358edebe4d9e0205ba83fa59a2d0e49abd48547da9e39df68b07320413a89ea3a0ec008e2ed3c3d9f0e8bffc87ed8f4885d883d
6
+ metadata.gz: 6f243889b5495aa2cf02a368da79aef5a98e1e3b7d7faef66ef7dabe09ca1b012535ade8f2db7674dae9ea37ad8bcb57f91510028197f48c0e0fa288118b90b0
7
+ data.tar.gz: 4d38c93addb9797e764f91a2d3bf47794f4f7117d214280d78cb5ff4a1db376a6928f33ebf833dfc78a85579c9accf67c555c1df42418e5f86bc172a17067e54
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # sorted
1
+ # Sorted
2
2
 
3
3
  [![Build Status](https://travis-ci.org/mynameisrufus/sorted.svg?branch=master)](https://travis-ci.org/mynameisrufus/sorted)
4
4
 
@@ -7,8 +7,37 @@ module Sorted
7
7
  raw.to_s.split(delim).inject(Set.new, &block)
8
8
  end
9
9
 
10
- def parse_match(m)
11
- [(m[2].nil? ? m[1] : m[2]), (m[3].nil? ? 'asc' : m[3].downcase)]
10
+ def parse_match(raw)
11
+ return parse_sort_with_direction(raw) if raw[5].nil?
12
+
13
+ parse_sort_without_direction(raw)
14
+ end
15
+
16
+ def parse_sort_with_direction(raw)
17
+ parsed = []
18
+ parsed << parse_column(raw[1], raw[2])
19
+ parsed << parse_direction(raw[3])
20
+ parsed << parse_nulls(raw[4]) unless raw[4].nil?
21
+ parsed
22
+ end
23
+
24
+ def parse_sort_without_direction(raw)
25
+ parsed = []
26
+ parsed << parse_column(raw[1], raw[5])
27
+ parsed << parse_nulls(raw[6]) unless raw[6].nil?
28
+ parsed
29
+ end
30
+
31
+ def parse_column(raw_all_content, raw_column)
32
+ raw_column || raw_all_content
33
+ end
34
+
35
+ def parse_direction(raw_direction)
36
+ raw_direction.nil? ? 'asc' : raw_direction.downcase
37
+ end
38
+
39
+ def parse_nulls(raw_nulls)
40
+ raw_nulls.downcase
12
41
  end
13
42
  end
14
43
  end
@@ -5,7 +5,11 @@ module Sorted
5
5
  class SQLQuery
6
6
  extend Parse
7
7
 
8
- REGEXP = /(([a-z0-9._]+)\s([asc|desc]+)|[a-z0-9._]+)/i
8
+ REGEXP = %r{
9
+ (([a-z0-9._]+)\s([asc|desc]+)\s?(nulls\s[first|last]+)?|
10
+ ([a-z0-9._]+)\s(nulls\s[first|last]+)|
11
+ ([a-z0-9._]+))
12
+ }xi
9
13
 
10
14
  def self.parse(raw)
11
15
  split(raw, /,/) do |set, part|
@@ -16,8 +20,29 @@ module Sorted
16
20
  end
17
21
 
18
22
  def self.encode(set, quote_proc = ->(f) { f })
19
- set.map { |a| "#{column(a[0], quote_proc)} #{a[1].upcase}" }.join(', ')
23
+ set.map do |a|
24
+ encoded = "#{column(a[0], quote_proc)}"
25
+
26
+ if sort_has_direction?(a)
27
+ encoded += " #{a[1].upcase}"
28
+ encoded += encode_nulls(a[2]) unless a[2].nil?
29
+ else
30
+ encoded += encode_nulls(a[1]) unless a[1].nil?
31
+ end
32
+
33
+ encoded
34
+ end.join(', ')
35
+ end
36
+
37
+ def self.sort_has_direction?(raw)
38
+ raw[1].match(/ASC|DESC/i) unless raw[1].nil?
39
+ end
40
+ private_class_method :sort_has_direction?
41
+
42
+ def self.encode_nulls(raw_nulls)
43
+ " #{raw_nulls.upcase.tr('_', ' ')}"
20
44
  end
45
+ private_class_method :encode_nulls
21
46
 
22
47
  def self.column(parts, quote_proc)
23
48
  parts.split('.').map { |frag| quote_proc.call(frag) }.join('.')
@@ -5,7 +5,10 @@ module Sorted
5
5
  class URIQuery
6
6
  extend Parse
7
7
 
8
- REGEXP = /(([a-z0-9._]+)_([asc|desc]+)|[a-z0-9._]+)/i
8
+ REGEXP = %r{
9
+ (([a-z0-9._]+)_([asc|desc]+)_?(nulls_first|nulls_last)?|
10
+ ([a-z0-9._]+)_(nulls_first|nulls_last))
11
+ }xi
9
12
 
10
13
  def self.parse(raw)
11
14
  split(raw, /!/) do |set, part|
@@ -1,3 +1,3 @@
1
1
  module Sorted
2
- VERSION = '2.1.2'
2
+ VERSION = '2.2.0'
3
3
  end
@@ -34,6 +34,22 @@ describe Sorted::SQLQuery, 'decode' do
34
34
 
35
35
  expect(set).to eq(result)
36
36
  end
37
+
38
+ it 'should decode nulls first/last' do
39
+ sql = 'email ASC NULLS FIRST, phone ASC, name DESC NULLS LAST'
40
+ set = Sorted::SQLQuery.parse(sql)
41
+ result = Sorted::Set.new([['email', 'asc', 'nulls first'], ['phone', 'asc'], ['name', 'desc', 'nulls last']])
42
+
43
+ expect(set).to eq(result)
44
+ end
45
+
46
+ it 'should decode nulls first/last without asc/desc' do
47
+ sql = 'email NULLS FIRST, phone, name NULLS LAST'
48
+ set = Sorted::SQLQuery.parse(sql)
49
+ result = Sorted::Set.new([['email', 'nulls first'], ['phone', 'asc'], ['name', 'nulls last']])
50
+
51
+ expect(set).to eq(result)
52
+ end
37
53
  end
38
54
 
39
55
  describe Sorted::SQLQuery, 'encode' do
@@ -58,4 +74,18 @@ describe Sorted::SQLQuery, 'encode' do
58
74
 
59
75
  expect(Sorted::SQLQuery.encode(set, quoter)).to eq(result)
60
76
  end
77
+
78
+ it 'should encode nulls first/last' do
79
+ set = Sorted::Set.new([['email', 'desc', 'nulls_last'], ['name', 'desc'], ['phone', 'asc', 'nulls_first']])
80
+ result = '`email` DESC NULLS LAST, `name` DESC, `phone` ASC NULLS FIRST'
81
+
82
+ expect(Sorted::SQLQuery.encode(set, quoter)).to eq(result)
83
+ end
84
+
85
+ it 'should encode nulls first/last without asc/desc' do
86
+ set = Sorted::Set.new([['email', 'nulls_last'], ['name'], ['phone', 'nulls_first']])
87
+ result = '`email` NULLS LAST, `name`, `phone` NULLS FIRST'
88
+
89
+ expect(Sorted::SQLQuery.encode(set, quoter)).to eq(result)
90
+ end
61
91
  end
@@ -10,6 +10,22 @@ describe Sorted::URIQuery, 'decode' do
10
10
 
11
11
  expect(set).to eq(result)
12
12
  end
13
+
14
+ it 'should decode nulls first/last' do
15
+ uri = 'table_name.column_name_desc_nulls_last!table_name.column_name_5_asc_nulls_first'
16
+ set = Sorted::URIQuery.parse(uri)
17
+ result = [['table_name.column_name', 'desc', 'nulls_last'], ['table_name.column_name_5', 'asc', 'nulls_first']]
18
+
19
+ expect(set).to eq(result)
20
+ end
21
+
22
+ it 'should decode nulls first/last without asc/desc' do
23
+ uri = 'table_name.column_name_nulls_last!table_name.column_name_5_nulls_first'
24
+ set = Sorted::URIQuery.parse(uri)
25
+ result = [['table_name.column_name', 'nulls_last'], ['table_name.column_name_5', 'nulls_first']]
26
+
27
+ expect(set).to eq(result)
28
+ end
13
29
  end
14
30
 
15
31
  describe Sorted::URIQuery, 'encode' do
@@ -19,4 +35,18 @@ describe Sorted::URIQuery, 'encode' do
19
35
 
20
36
  expect(Sorted::URIQuery.encode(set)).to eq(result)
21
37
  end
38
+
39
+ it 'should encode nulls first/last' do
40
+ set = Sorted::Set.new([%w[column_name desc nulls_last], %w[column_name_5 asc nulls_first]])
41
+ result = 'column_name_desc_nulls_last!column_name_5_asc_nulls_first'
42
+
43
+ expect(Sorted::URIQuery.encode(set)).to eq(result)
44
+ end
45
+
46
+ it 'should encode nulls first/last' do
47
+ set = Sorted::Set.new([%w[column_name nulls_last], %w[column_name_5 nulls_first]])
48
+ result = 'column_name_nulls_last!column_name_5_nulls_first'
49
+
50
+ expect(Sorted::URIQuery.encode(set)).to eq(result)
51
+ end
22
52
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorted
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rufus Post
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-11 00:00:00.000000000 Z
11
+ date: 2019-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
119
  version: 1.3.6
120
120
  requirements: []
121
121
  rubyforge_project: sorted
122
- rubygems_version: 2.4.5
122
+ rubygems_version: 2.5.2.3
123
123
  signing_key:
124
124
  specification_version: 4
125
125
  summary: Data sorting library