strip_attributes 1.8.1 → 1.9.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: 287d7a12033039a5d2f06d55433a9f613ad584886a4add18b78ff6f432455073
4
- data.tar.gz: d30d2f78245bfce1534c0509366fa12cbb0bdea7945f2dd97547bb257a926053
3
+ metadata.gz: e52f0da3132c0ac375581d84279e40f5a118efd62880a094a46cbb99fcf38b2c
4
+ data.tar.gz: 3ffd42e6130993495406c5b32d5ba93e7b538f85b9295ac9d83f0cae9d65d132
5
5
  SHA512:
6
- metadata.gz: 1e6fbbb056f4ad22e8d4d13c767f3ae2124ede7a7d39e5cffcb9a406be4f590cfbb0f495cf2c6ea0fa8efc1e750e2e333b8eb4467d1ffee582c36deabb2b1417
7
- data.tar.gz: ec6311504c2dd730e4810cce0cd72aaf9a2ce5cdbe383214c7e8e46c98cacc82732f8304c90128646c26cc7f99c91227f2cb2f51fcc844d8265e04040db5a688
6
+ metadata.gz: a76db1928d1327ca44d834384679e7a1150e773f414c344d2469b02d144f2f8f103da8cd19664810dbb0d93e7b4dd4fb3a2afed2a8558c8d61a9027d30d23d03
7
+ data.tar.gz: 4a2085e2618d2d0e661b9b2dffc8741cad0b965a8b4342cc57fedd5a48e13cb70e444feb94ee1688c67051c5d6b747e9ebad29a0486b4a01a4bba34c1f2c32fd
data/README.md CHANGED
@@ -13,6 +13,8 @@ attributes are stripped of whitespace, but `:only` and `:except`
13
13
  options can be used to limit which attributes are stripped. Both options accept
14
14
  a single attribute (`only: :field`) or arrays of attributes (`except: [:field1, :field2, :field3]`).
15
15
 
16
+ It's also possible to skip stripping the attributes altogether per model using the `:if` and `:unless` options.
17
+
16
18
  ---
17
19
 
18
20
  **How You Can Help**
@@ -67,6 +69,32 @@ class ConservativePokerPlayer < ActiveRecord::Base
67
69
  end
68
70
  ```
69
71
 
72
+ ### Using `if`
73
+
74
+ ```ruby
75
+ # Only records with odd ids will be stripped
76
+ class OddPokerPlayer < ActiveRecord::Base
77
+ strip_attributes if: :strip_me?
78
+
79
+ def strip_me?
80
+ id.odd?
81
+ end
82
+ end
83
+ ```
84
+
85
+ ### Using `unless`
86
+
87
+ ```ruby
88
+ # strip_attributes will be applied randomly
89
+ class RandomPokerPlayer < ActiveRecord::Base
90
+ strip_attributes unless: :strip_me?
91
+
92
+ def strip_me?
93
+ [true, false].sample
94
+ end
95
+ end
96
+ ```
97
+
70
98
  ### Using `allow_empty`
71
99
 
72
100
  ```ruby
@@ -1,3 +1,3 @@
1
1
  module StripAttributes
2
- VERSION = "1.8.1"
2
+ VERSION = "1.9.0"
3
3
  end
@@ -2,24 +2,24 @@ require "active_model"
2
2
 
3
3
  module ActiveModel::Validations::HelperMethods
4
4
  # Strips whitespace from model fields and converts blank values to nil.
5
- def strip_attributes(options = nil)
5
+ def strip_attributes(options = {})
6
6
  StripAttributes.validate_options(options)
7
7
 
8
- before_validation do |record|
8
+ before_validation(options.slice(:if, :unless)) do |record|
9
9
  StripAttributes.strip(record, options)
10
10
  end
11
11
  end
12
12
 
13
13
  # <b>DEPRECATED:</b> Please use <tt>strip_attributes</tt> (non-bang method)
14
14
  # instead.
15
- def strip_attributes!(options = nil)
15
+ def strip_attributes!(options = {})
16
16
  warn "[DEPRECATION] `strip_attributes!` is deprecated. Please use `strip_attributes` (non-bang method) instead."
17
17
  strip_attributes(options)
18
18
  end
19
19
  end
20
20
 
21
21
  module StripAttributes
22
- VALID_OPTIONS = [:only, :except, :allow_empty, :collapse_spaces, :replace_newlines, :regex]
22
+ VALID_OPTIONS = [:only, :except, :allow_empty, :collapse_spaces, :replace_newlines, :regex, :if, :unless]
23
23
 
24
24
  # Unicode invisible and whitespace characters. The POSIX character class
25
25
  # [:space:] corresponds to the Unicode class Z ("separator"). We also
@@ -37,7 +37,7 @@ module StripAttributes
37
37
  MULTIBYTE_BLANK = /[[:blank:]#{MULTIBYTE_WHITE}]/
38
38
  MULTIBYTE_SUPPORTED = "\u0020" == " "
39
39
 
40
- def self.strip(record_or_string, options = nil)
40
+ def self.strip(record_or_string, options = {})
41
41
  if record_or_string.respond_to?(:attributes)
42
42
  strip_record(record_or_string, options)
43
43
  else
@@ -45,7 +45,7 @@ module StripAttributes
45
45
  end
46
46
  end
47
47
 
48
- def self.strip_record(record, options = nil)
48
+ def self.strip_record(record, options = {})
49
49
  attributes = narrow(record.attributes, options)
50
50
 
51
51
  attributes.each do |attr, value|
@@ -57,13 +57,11 @@ module StripAttributes
57
57
  record
58
58
  end
59
59
 
60
- def self.strip_string(value, options = nil)
61
- if options
62
- allow_empty = options[:allow_empty]
63
- collapse_spaces = options[:collapse_spaces]
64
- replace_newlines = options[:replace_newlines]
65
- regex = options[:regex]
66
- end
60
+ def self.strip_string(value, options = {})
61
+ allow_empty = options[:allow_empty]
62
+ collapse_spaces = options[:collapse_spaces]
63
+ replace_newlines = options[:replace_newlines]
64
+ regex = options[:regex]
67
65
 
68
66
  if value.respond_to?(:strip)
69
67
  value = (value.blank? && !allow_empty) ? nil : value.strip
@@ -97,10 +95,10 @@ module StripAttributes
97
95
  # Necessary because Rails has removed the narrowing of attributes using :only
98
96
  # and :except on Base#attributes
99
97
  def self.narrow(attributes, options = {})
100
- if except = options && options[:except]
98
+ if except = options[:except]
101
99
  except = Array(except).collect { |attribute| attribute.to_s }
102
100
  attributes.except(*except)
103
- elsif only = options && options[:only]
101
+ elsif only = options[:only]
104
102
  only = Array(only).collect { |attribute| attribute.to_s }
105
103
  attributes.slice(*only)
106
104
  else
@@ -109,7 +107,7 @@ module StripAttributes
109
107
  end
110
108
 
111
109
  def self.validate_options(options)
112
- if keys = options && options.keys
110
+ if keys = options.keys
113
111
  unless (keys - VALID_OPTIONS).empty?
114
112
  raise ArgumentError, "Options does not specify #{VALID_OPTIONS} (#{options.keys.inspect})"
115
113
  end
@@ -9,6 +9,8 @@ module MockAttributes
9
9
  base.attribute :bang
10
10
  base.attribute :foz
11
11
  base.attribute :fiz
12
+ base.attribute :strip_me
13
+ base.attribute :skip_me
12
14
  end
13
15
  end
14
16
 
@@ -72,6 +74,29 @@ class StripRegexMockRecord < Tableless
72
74
  strip_attributes regex: /[\^\%&\*]/
73
75
  end
74
76
 
77
+ class IfSymMockRecord < Tableless
78
+ include MockAttributes
79
+ strip_attributes if: :strip_me?
80
+
81
+ def strip_me?
82
+ strip_me
83
+ end
84
+ end
85
+
86
+ class UnlessSymMockRecord < Tableless
87
+ include MockAttributes
88
+ strip_attributes unless: :skip_me?
89
+
90
+ def skip_me?
91
+ skip_me
92
+ end
93
+ end
94
+
95
+ class IfProcMockRecord < Tableless
96
+ include MockAttributes
97
+ strip_attributes if: Proc.new { |record| record.strip_me }
98
+ end
99
+
75
100
  class StripAttributesTest < Minitest::Test
76
101
  def setup
77
102
  @init_params = {
@@ -242,6 +267,78 @@ class StripAttributesTest < Minitest::Test
242
267
  assert_equal "foo", record.foo
243
268
  end
244
269
 
270
+ def test_should_strip_all_fields_if_true
271
+ record = IfSymMockRecord.new(@init_params.merge(strip_me: true))
272
+ record.valid?
273
+ assert_equal "foo", record.foo
274
+ assert_equal "bar", record.bar
275
+ assert_equal "biz", record.biz
276
+ assert_equal "foz foz", record.foz
277
+ assert_equal "fiz \n fiz", record.fiz
278
+ assert_nil record.baz
279
+ assert_nil record.bang
280
+ end
281
+
282
+ def test_should_strip_no_fields_if_false
283
+ record = IfSymMockRecord.new(@init_params.merge(strip_me: false))
284
+ record.valid?
285
+ assert_equal "\tfoo", record.foo
286
+ assert_equal "bar \t ", record.bar
287
+ assert_equal "\tbiz ", record.biz
288
+ assert_equal " foz foz", record.foz
289
+ assert_equal "fiz \n fiz", record.fiz
290
+ assert_equal "", record.baz
291
+ assert_equal " ", record.bang
292
+ end
293
+
294
+ def test_should_strip_all_fields_unless_false
295
+ record = UnlessSymMockRecord.new(@init_params.merge(skip_me: false))
296
+ record.valid?
297
+ assert_equal "foo", record.foo
298
+ assert_equal "bar", record.bar
299
+ assert_equal "biz", record.biz
300
+ assert_equal "foz foz", record.foz
301
+ assert_equal "fiz \n fiz", record.fiz
302
+ assert_nil record.baz
303
+ assert_nil record.bang
304
+ end
305
+
306
+ def test_should_strip_no_fields_unless_true
307
+ record = UnlessSymMockRecord.new(@init_params.merge(skip_me: true))
308
+ record.valid?
309
+ assert_equal "\tfoo", record.foo
310
+ assert_equal "bar \t ", record.bar
311
+ assert_equal "\tbiz ", record.biz
312
+ assert_equal " foz foz", record.foz
313
+ assert_equal "fiz \n fiz", record.fiz
314
+ assert_equal "", record.baz
315
+ assert_equal " ", record.bang
316
+ end
317
+
318
+ def test_should_strip_all_fields_if_true_proc
319
+ record = IfProcMockRecord.new(@init_params.merge(strip_me: true))
320
+ record.valid?
321
+ assert_equal "foo", record.foo
322
+ assert_equal "bar", record.bar
323
+ assert_equal "biz", record.biz
324
+ assert_equal "foz foz", record.foz
325
+ assert_equal "fiz \n fiz", record.fiz
326
+ assert_nil record.baz
327
+ assert_nil record.bang
328
+ end
329
+
330
+ def test_should_strip_no_fields_if_false_proc
331
+ record = IfProcMockRecord.new(@init_params.merge(strip_me: false))
332
+ record.valid?
333
+ assert_equal "\tfoo", record.foo
334
+ assert_equal "bar \t ", record.bar
335
+ assert_equal "\tbiz ", record.biz
336
+ assert_equal " foz foz", record.foz
337
+ assert_equal "fiz \n fiz", record.fiz
338
+ assert_equal "", record.baz
339
+ assert_equal " ", record.bang
340
+ end
341
+
245
342
  class ClassMethodsTest < Minitest::Test
246
343
  def test_should_strip_whitespace
247
344
  assert_nil StripAttributes.strip("")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strip_attributes
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.1
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan McGeary
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-22 00:00:00.000000000 Z
11
+ date: 2019-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel