strip_attributes 1.5.1 → 1.6.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: 0e4b323cd614f1fe461e795f9639291ac5eda4db
4
- data.tar.gz: 41546e168fb2fdf9220c1048b86cf2ddeca972b5
3
+ metadata.gz: ed934987322fa0c7a338d28649edd88a8520bf38
4
+ data.tar.gz: 2e1d75c6c7c5cb6b22e902cf3a80ebd22c5cf1aa
5
5
  SHA512:
6
- metadata.gz: a632fd515e427df871254d544f625facdc50aedb24919499f261bea2d39a82401fce27410062186da237586e6962461197babb7988c0206917cb3a3c020423d8
7
- data.tar.gz: 127b3edc8af1a095691071279ba760522b5e64dcff6d3793d575e77b7fb7508392e15e1421fecc1c780700d17d8bfba0785194763c286d34bf1e97072d44246e
6
+ metadata.gz: 061fb3c3a5325750dc31a3e3c501a04c8d8da8dcb9516a2f76660ce5af1d920b0113ccf873f65065fa1be4242ab54f43432d3065b4d1b06482090ab8ea8b3764
7
+ data.tar.gz: 48a502af83d76d0e48b0e81e00aad261e50c46b31c265cc04d6d00d31a62da8a4a15371e423ef7b52eaa22497a126afad11bebab42c389851a163df12b52d744
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # StripAttributes [![Gem Version](https://badge.fury.io/rb/strip_attributes.png)](http://badge.fury.io/rb/strip_attributes) [![Build Status](https://secure.travis-ci.org/rmm5t/strip_attributes.png)](http://travis-ci.org/rmm5t/strip_attributes) [![Code Climate](https://codeclimate.com/github/rmm5t/strip_attributes.png)](https://codeclimate.com/github/rmm5t/strip_attributes)
1
+ # StripAttributes [![Gem Version](http://img.shields.io/gem/v/strip_attributes.svg)](https://rubygems.org/gems/strip_attributes) [![Build Status](https://secure.travis-ci.org/rmm5t/strip_attributes.svg)](http://travis-ci.org/rmm5t/strip_attributes) [![Code Climate](http://img.shields.io/codeclimate/github/rmm5t/strip_attributes.svg)](https://codeclimate.com/github/rmm5t/strip_attributes)
2
2
 
3
3
  StripAttributes is an ActiveModel extension that automatically strips all
4
4
  attributes of leading and trailing whitespace before validation. If the
@@ -10,10 +10,26 @@ options can be used to limit which attributes are stripped. Both options accept
10
10
  a single attribute (`:only => :field`) or arrays of attributes (`:except =>
11
11
  [:field1, :field2, :field3]`).
12
12
 
13
- **If you like this project, please help by donating.**
13
+ ## How You Can Help
14
14
 
15
- * Gittip: https://www.gittip.com/rmm5t/
16
- * Bitcoin: `1wzBnMjWVZfpiFMc5i2nzKT7sCBaZNfLK`
15
+ **If you like this project, please help. [Donate via Gittip][gittip] or [buy me a coffee with Bitcoin][bitcoin].**<br>
16
+ [![Gratipay](http://img.shields.io/gratipay/rmm5t.svg)][gratipay]
17
+ [![Bitcoin](http://img.shields.io/badge/bitcoin-buy%20me%20a%20coffee-brightgreen.svg)][bitcoin]
18
+
19
+ **[Bitcoin][bitcoin]**: `1rmm5tv6f997JK5bLcGbRCZyVjZUPkQ2m`<br>
20
+ [![Bitcoin Donation][bitcoin-qr-small]][bitcoin-qr-big]
21
+
22
+ ## Need Help?
23
+
24
+ **You can [book a session with me on Codementor][codementor].**<br>
25
+ [![Book a Codementor session](http://img.shields.io/badge/codementor-book%20a%20session-orange.svg)][codementor]
26
+
27
+ [gratipay]: https://gratipay.com/rmm5t/ "Donate to rmm5t for open source!"
28
+ [bitcoin]: https://blockchain.info/address/1rmm5tv6f997JK5bLcGbRCZyVjZUPkQ2m "Buy rmm5t a coffee for open source!"
29
+ [bitcoin-scheme]: bitcoin:1rmm5tv6f997JK5bLcGbRCZyVjZUPkQ2m?amount=0.01&label=Coffee%20to%20rmm5t%20for%20Open%20Source "Buy rmm5t a coffee for open source!"
30
+ [bitcoin-qr-small]: http://chart.apis.google.com/chart?cht=qr&chs=150x150&chl=bitcoin%3A1rmm5tv6f997JK5bLcGbRCZyVjZUPkQ2m%3Famount%3D0.01%26label%3DCoffee%2520to%2520rmm5t%2520for%2520Open%2520Source
31
+ [bitcoin-qr-big]: http://chart.apis.google.com/chart?cht=qr&chs=500x500&chl=bitcoin%3A1rmm5tv6f997JK5bLcGbRCZyVjZUPkQ2m%3Famount%3D0.01%26label%3DCoffee%2520to%2520rmm5t%2520for%2520Open%2520Source
32
+ [codementor]: https://www.codementor.io/rmm5t?utm_campaign=profile&utm_source=button-rmm5t&utm_medium=shields "Book a session with rmm5t on Codementor!"
17
33
 
18
34
  ## Installation
19
35
 
@@ -77,6 +93,8 @@ class User < ActiveRecord::Base
77
93
  strip_attributes :only => [:first_name, :last_name], :regex => /[^[:alpha:]\s]/
78
94
  # Strip off non-integers
79
95
  strip_attributes :only => [:phone], :regex => /[^0-9]/
96
+ # Strip off all spaces and keep only alphabetic and numeric characters
97
+ strip_attributes :only => [:nick_name], :regex => /[^[:alnum:]\S]/
80
98
  end
81
99
  ```
82
100
 
@@ -108,6 +126,17 @@ end
108
126
 
109
127
  ```
110
128
 
129
+ ### Using it directly
130
+
131
+ ```ruby
132
+ # where record is an ActiveModel isntance
133
+ StripAttributes.strip(record, :collapse_spaces => true)
134
+
135
+ # works directly on Strings too
136
+ StripAttributes.strip(" foo \t") #=> "foo"
137
+ StripAttributes.strip(" foo bar", :collapse_spaces => true) #=> "foo bar"
138
+ ```
139
+
111
140
  ## Testing
112
141
 
113
142
  StripAttributes provides an RSpec/Shoulda-compatible matcher for easier
@@ -146,13 +175,13 @@ end
146
175
 
147
176
  ### Writing Tests
148
177
 
149
- **Rspec**:
178
+ **RSpec**:
150
179
 
151
180
  ```ruby
152
181
  describe User do
153
- it { should strip_attribute(:name).collapse_spaces }
154
- it { should strip_attribute :email }
155
- it { should_not strip_attribute :password }
182
+ it { is_expected.to strip_attribute(:name).collapse_spaces }
183
+ it { is_expected.to strip_attribute :email }
184
+ it { is_expected.not_to strip_attribute :password }
156
185
  end
157
186
  ```
158
187
 
@@ -22,6 +22,67 @@ module StripAttributes
22
22
  VALID_OPTIONS = [:only, :except, :allow_empty, :collapse_spaces, :regex]
23
23
  MULTIBYTE_SUPPORTED = "\u0020" == " "
24
24
 
25
+ def self.strip(record_or_string, options = nil)
26
+ if record_or_string.respond_to?(:attributes)
27
+ strip_record(record_or_string, options)
28
+ else
29
+ strip_string(record_or_string, options)
30
+ end
31
+ end
32
+
33
+ def self.strip_record(record, options = nil)
34
+ attributes = narrow(record.attributes, options)
35
+
36
+ attributes.each do |attr, value|
37
+ original_value = value
38
+ value = strip_string(value, options)
39
+ record[attr] = value if original_value != value
40
+ end
41
+
42
+ record
43
+ end
44
+
45
+ def self.strip_string(value, options = nil)
46
+ if options
47
+ allow_empty = options[:allow_empty]
48
+ collapse_spaces = options[:collapse_spaces]
49
+ regex = options[:regex]
50
+ end
51
+
52
+ if value.respond_to?(:strip)
53
+ value = (value.blank? && !allow_empty) ? nil : value.strip
54
+ end
55
+
56
+ if regex && value.respond_to?(:gsub!)
57
+ value.gsub!(regex, '')
58
+ end
59
+
60
+ if MULTIBYTE_SUPPORTED
61
+ # Remove leading and trailing Unicode invisible and whitespace characters.
62
+ # The POSIX character class [:space:] corresponds to the Unicode class Z
63
+ # ("separator"). We also include the following characters from Unicode class
64
+ # C ("control"), which are spaces or invisible characters that make no
65
+ # sense at the start or end of a string:
66
+ # U+180E MONGOLIAN VOWEL SEPARATOR
67
+ # U+200B ZERO WIDTH SPACE
68
+ # U+200C ZERO WIDTH NON-JOINER
69
+ # U+200D ZERO WIDTH JOINER
70
+ # U+2060 WORD JOINER
71
+ # U+FEFF ZERO WIDTH NO-BREAK SPACE
72
+ if value.respond_to?(:gsub!)
73
+ value.gsub!(/\A[[:space:]\u180E\u200B\u200C\u200D\u2060\uFEFF]+|[[:space:]\u180E\u200B\u200C\u200D\u2060\uFEFF]+\z/, '')
74
+ end
75
+ elsif value.respond_to?(:strip!)
76
+ value.strip!
77
+ end
78
+
79
+ if collapse_spaces && value.respond_to?(:squeeze!)
80
+ value.squeeze!(' ')
81
+ end
82
+
83
+ value
84
+ end
85
+
25
86
  # Necessary because Rails has removed the narrowing of attributes using :only
26
87
  # and :except on Base#attributes
27
88
  def self.narrow(attributes, options = {})
@@ -36,51 +97,6 @@ module StripAttributes
36
97
  end
37
98
  end
38
99
 
39
- def self.strip(record, options)
40
- attributes = self.narrow(record.attributes, options)
41
-
42
- if options
43
- allow_empty = options[:allow_empty]
44
- collapse_spaces = options[:collapse_spaces]
45
- regex = options[:regex]
46
- end
47
-
48
- attributes.each do |attr, value|
49
- original_value = value
50
-
51
- if value.respond_to?(:strip)
52
- value = (value.blank? && !allow_empty) ? nil : value.strip
53
- end
54
-
55
- if regex && value.respond_to?(:gsub!)
56
- value.gsub!(regex, '')
57
- end
58
-
59
- if MULTIBYTE_SUPPORTED
60
- # Remove leading and trailing Unicode invisible and whitespace characters.
61
- # The POSIX character class [:space:] corresponds to the Unicode class Z
62
- # ("separator"). We also include the following characters from Unicode class
63
- # C ("control"), which are spaces or invisible characters that make no
64
- # sense at the start or end of a string:
65
- # U+180E MONGOLIAN VOWEL SEPARATOR
66
- # U+200B ZERO WIDTH SPACE
67
- # U+200C ZERO WIDTH NON-JOINER
68
- # U+200D ZERO WIDTH JOINER
69
- # U+2060 WORD JOINER
70
- # U+FEFF ZERO WIDTH NO-BREAK SPACE
71
- if value.respond_to?(:gsub!)
72
- value.gsub!(/\A[[:space:]\u180E\u200B\u200C\u200D\u2060\uFEFF]+|[[:space:]\u180E\u200B\u200C\u200D\u2060\uFEFF]+\z/, '')
73
- end
74
- end
75
-
76
- if collapse_spaces && value.respond_to?(:squeeze!)
77
- value.squeeze!(' ')
78
- end
79
-
80
- record[attr] = value if original_value != value
81
- end
82
- end
83
-
84
100
  def self.validate_options(options)
85
101
  if keys = options && options.keys
86
102
  unless (keys - VALID_OPTIONS).empty?
@@ -5,8 +5,8 @@ module StripAttributes
5
5
  #
6
6
  # RSpec Examples:
7
7
  #
8
- # it { should strip_attribute(:first_name) }
9
- # it { should_not strip_attribute(:password) }
8
+ # it { is_expected.to strip_attribute(:first_name) }
9
+ # it { is_expected.not_to strip_attribute(:password) }
10
10
  #
11
11
  # Minitest Matchers Examples:
12
12
  #
@@ -1,3 +1,3 @@
1
1
  module StripAttributes
2
- VERSION = "1.5.1"
2
+ VERSION = "1.6.0"
3
3
  end
@@ -61,7 +61,7 @@ class StripRegexMockRecord < Tableless
61
61
  strip_attributes :regex => /[\^\%&\*]/
62
62
  end
63
63
 
64
- class StripAttributesTest < MiniTest::Unit::TestCase
64
+ class StripAttributesTest < Minitest::Test
65
65
  def setup
66
66
  @init_params = { :foo => "\tfoo", :bar => "bar \t ", :biz => "\tbiz ", :baz => "", :bang => " ", :foz => " foz foz" }
67
67
  end
@@ -181,9 +181,9 @@ class StripAttributesTest < MiniTest::Unit::TestCase
181
181
  record.valid?
182
182
  assert_equal "abc", record.foo
183
183
  assert_equal "bar", record.bar
184
- end
184
+ end
185
185
 
186
- def test_strip_unicode
186
+ def test_should_strip_unicode
187
187
  # This feature only works if multi-byte characters are supported by Ruby
188
188
  return if "\u0020" != " "
189
189
  # U200A - HAIR SPACE
@@ -192,4 +192,33 @@ class StripAttributesTest < MiniTest::Unit::TestCase
192
192
  record.valid?
193
193
  assert_equal "foo", record.foo
194
194
  end
195
+
196
+ class ClassMethodsTest < Minitest::Test
197
+ def test_should_strip_whitespace
198
+ assert_equal nil, StripAttributes.strip("")
199
+ assert_equal nil, StripAttributes.strip(" \t ")
200
+ assert_equal "thirty six", StripAttributes.strip(" thirty six \t \n")
201
+ end
202
+
203
+ def test_should_allow_empty
204
+ assert_equal "", StripAttributes.strip("", :allow_empty => true)
205
+ assert_equal "", StripAttributes.strip(" \t ", :allow_empty => true)
206
+ end
207
+
208
+ def test_should_collapse_spaces
209
+ assert_equal "1 2 3", StripAttributes.strip(" 1 2 3\t ", :collapse_spaces => true)
210
+ end
211
+
212
+ def test_should_strip_regex
213
+ assert_equal "abc", StripAttributes.strip("^%&*abc ^ ", :regex => /[\^\%&\*]/)
214
+ end
215
+
216
+ def test_should_strip_unicode
217
+ # This feature only works if multi-byte characters are supported by Ruby
218
+ return if "\u0020" != " "
219
+ # U200A - HAIR SPACE
220
+ # U200B - ZERO WIDTH SPACE
221
+ assert_equal "foo", StripAttributes.strip("\u200A\u200B foo\u200A\u200B ")
222
+ end
223
+ end
195
224
  end
data/test/test_helper.rb CHANGED
@@ -13,3 +13,6 @@ end
13
13
 
14
14
  # Avoid annoying deprecation warning
15
15
  I18n.enforce_available_locales = true
16
+
17
+ # Remove this after we drop support for Rails 3.2 and Minitest 4.x
18
+ Minitest::Test = Minitest::Unit::TestCase unless defined?(Minitest::Test)
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.5.1
4
+ version: 1.6.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: 2014-03-25 00:00:00.000000000 Z
11
+ date: 2015-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -62,30 +62,36 @@ dependencies:
62
62
  name: minitest
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - "~>"
65
+ - - ">="
66
66
  - !ruby/object:Gem::Version
67
67
  version: '4.7'
68
+ - - "<"
69
+ - !ruby/object:Gem::Version
70
+ version: '6.0'
68
71
  type: :development
69
72
  prerelease: false
70
73
  version_requirements: !ruby/object:Gem::Requirement
71
74
  requirements:
72
- - - "~>"
75
+ - - ">="
73
76
  - !ruby/object:Gem::Version
74
77
  version: '4.7'
78
+ - - "<"
79
+ - !ruby/object:Gem::Version
80
+ version: '6.0'
75
81
  - !ruby/object:Gem::Dependency
76
82
  name: rake
77
83
  requirement: !ruby/object:Gem::Requirement
78
84
  requirements:
79
85
  - - "~>"
80
86
  - !ruby/object:Gem::Version
81
- version: '10.0'
87
+ version: 10.1.1
82
88
  type: :development
83
89
  prerelease: false
84
90
  version_requirements: !ruby/object:Gem::Requirement
85
91
  requirements:
86
92
  - - "~>"
87
93
  - !ruby/object:Gem::Version
88
- version: '10.0'
94
+ version: 10.1.1
89
95
  description: StripAttributes automatically strips all ActiveRecord model attributes
90
96
  of leading and trailing whitespace before validation. If the attribute is blank,
91
97
  it strips the value to nil.
@@ -124,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
130
  version: '0'
125
131
  requirements: []
126
132
  rubyforge_project:
127
- rubygems_version: 2.2.2
133
+ rubygems_version: 2.4.5
128
134
  signing_key:
129
135
  specification_version: 4
130
136
  summary: Whitespace cleanup for ActiveModel attributes