sort_param 0.2.0 → 1.1.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
  SHA256:
3
- metadata.gz: c05d893490a180c3cb1ce696d8fbddf77f9e7a0f323434c755408f54f239c427
4
- data.tar.gz: 672ae31570afece8e8a18c504f7bbe47390d83c8e7485934edb473ace88e11db
3
+ metadata.gz: fb0d8250b0a318bf85f2031f497b703e044387bb9b0ce53588a7bd8aefe42cc1
4
+ data.tar.gz: e48ff69e8d9f9d1eeb188222abceb7368b1fc928bf36e52b6f9822321b854782
5
5
  SHA512:
6
- metadata.gz: 0dbaff8fc1c00aa5903ab1e75576b6af6d99ba37a3d90d41d8a2ef1ed4928d183a278d31552924aa94ba2aa0b395639d176a477cc50a0ed9379e61cc069c2ddb
7
- data.tar.gz: fe8ca1f676f8f4ff66a5e3a9395457218725eb440b37f1ee253752a5f77a1ae761e79136521735c0b291f92f54e6e3c02ec6e7416d3baa1a79840498c3e78c85
6
+ metadata.gz: e99bca609530200771778839f406bf270d2fa4a11041f9f44f095f2d6e81882fbf7f814e1a14699aa7b194ed6fa907eb69cb804824c85f5bcf4c3f85ca34ed65
7
+ data.tar.gz: 884b4a6af691fb6782c9b9f4db453d5e7f904e9b4ddf309c3e07999a51e136eae363acb5dbd2c60368ed315f17e707eacd8d2aa2c21f1bc8ad85dc91e4fa5765
data/CHANGELOG.md CHANGED
@@ -4,3 +4,8 @@
4
4
  ## [0.2.0]
5
5
  - Support setting a different field name in the formatted output
6
6
 
7
+ ## [1.0.0]
8
+ - Rename :formatted_name option to :rename
9
+
10
+ ## [1.1.0]
11
+ - Introduce definition#load to silently ignore non-whitelisted sort fields
data/README.md CHANGED
@@ -124,6 +124,37 @@ sort_param.load!("+first_name:nulls_last,-last_name:nulls_first", mode: :pg)
124
124
 
125
125
  => "first_name asc nulls last, last_name desc nulls first"
126
126
  ```
127
+
128
+ ### Ignoring non-whitelisted sort fields instead of raising error
129
+ Use `#load` method instead:
130
+
131
+ ```ruby
132
+ sort_param = SortParam.define do
133
+ field :first_name
134
+ end
135
+
136
+ sort_param.load("+first_name,+last_name", mode: :pg)
137
+ => "first_name asc"
138
+ ```
139
+
140
+ ### Render a different field name in the output
141
+ Set the `:rename` field option to output a different field name:
142
+
143
+ ```ruby
144
+ sort_param = SortParam.define do
145
+ field :first_name, rename: 'users.name'
146
+ end
147
+
148
+ sort_param.load!("+first_name", mode: :pg)
149
+ => "users.name asc"
150
+
151
+ sort_param.load!("+first_name", mode: :mysql)
152
+ => "users.name asc"
153
+
154
+ sort_param.load!("+first_name")
155
+ => {"users.name"=>{:direction=>:asc}}
156
+ ```
157
+
127
158
  <br/>
128
159
 
129
160
  ### Rails example
@@ -187,7 +218,7 @@ end
187
218
 
188
219
  | Class | Description |
189
220
  | ----------- | ----------- |
190
- | `SortParam::UnsupportedSortField` | Raised when a sort field from the parameter isn't included in the whitelisted sort fields. |
221
+ | `SortParam::UnsupportedSortField` | Raised when loading sort string via `#load!` and a sort field from the parameter isn't included in the whitelisted sort fields. |
191
222
 
192
223
  ## Development
193
224
 
@@ -26,7 +26,7 @@ module SortParam
26
26
  # @param name [String, Symbol] column name
27
27
  # @param defaults [Hash] column default options:
28
28
  # * nulls (Symbol) nulls sort order. `:last` or `:first`
29
- # * formatted_name (String) field name in formatted output
29
+ # * rename (String) field name in formatted output
30
30
  #
31
31
  # @return [self] Definition instance
32
32
  def field(name, defaults = {})
@@ -49,6 +49,20 @@ module SortParam
49
49
  @fields_hash[name].dup
50
50
  end
51
51
 
52
+ # Parse then translate a sort string expression and raise an error if the sort string includes
53
+ # a non-whitelisted sort field.
54
+ #
55
+ # @see #load
56
+ #
57
+ # @raise [SortParam::UnsupportedSortField] if :sort_string includes a non-whitelisted sort field.
58
+ #
59
+ def load!(sort_string, mode: :hash)
60
+ fields = Fields.new(sort_string)
61
+ validate_fields!(fields)
62
+
63
+ format_fields(mode, fields)
64
+ end
65
+
52
66
  # Parse then translate a sort string expression
53
67
  #
54
68
  # @param sort_string [String] Sort expression. Comma-separated sort fields.
@@ -71,18 +85,27 @@ module SortParam
71
85
  # @return [Hash, String, NilClass] Translated to SQL or Hash.
72
86
  # Returns nil if there is no column to sort.
73
87
  #
74
- def load!(sort_string, mode: :hash)
88
+ def load(sort_string, mode: :hash)
75
89
  fields = Fields.new(sort_string)
76
- validate_fields!(fields)
90
+ fields = fields.reject { |field| non_whitelisted_fields(fields).include?(field.name) }
77
91
 
78
- formatter = Formatters::Formatter.for(mode)
79
- formatter.new(self).format(*fields)
92
+ format_fields(mode, fields)
80
93
  end
81
94
 
82
95
  private
83
96
 
84
- def validate_fields!(fields)
85
- unknown_field = (fields.names - fields_hash.keys).first
97
+ def format_fields(mode, fields)
98
+ Formatters::Formatter.for(mode)
99
+ .new(self)
100
+ .format(*fields)
101
+ end
102
+
103
+ def non_whitelisted_fields(loaded_fields)
104
+ loaded_fields.names - fields_hash.keys
105
+ end
106
+
107
+ def validate_fields!(loaded_fields)
108
+ unknown_field = non_whitelisted_fields(loaded_fields).first
86
109
  return true if unknown_field.nil?
87
110
 
88
111
  raise SortParam::UnsupportedSortField.new("Unsupported sort field: #{unknown_field}")
@@ -38,7 +38,7 @@ module SortParam
38
38
  end
39
39
 
40
40
  def formatted_field_name(field)
41
- formatted_name = definition.field_defaults(field.name)[:formatted_name]
41
+ formatted_name = definition.field_defaults(field.name)[:rename]
42
42
 
43
43
  blank?(formatted_name) ? field.name : formatted_name
44
44
  end
@@ -18,7 +18,7 @@ module SortParam
18
18
  data = definition.field_defaults(field.name) || {}
19
19
  data.merge!(direction: field.direction)
20
20
  data.merge!(nulls: field.nulls) unless field.nulls.nil?
21
- data.delete(:formatted_name)
21
+ data.delete(:rename)
22
22
  data
23
23
  end
24
24
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SortParam
4
- VERSION = "0.2.0"
4
+ VERSION = "1.1.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sort_param
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uy Jayson B
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-13 00:00:00.000000000 Z
11
+ date: 2023-06-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Sort records using a sort query parameter à la JSON-API style
14
14
  email: