auto_strip_attributes 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +9 -0
- data/Gemfile +4 -0
- data/README.md +48 -0
- data/Rakefile +13 -0
- data/auto_strip_attributes.gemspec +28 -0
- data/lib/auto_strip_attributes.rb +37 -0
- data/lib/auto_strip_attributes/version.rb +4 -0
- data/test/auto_strip_attributes_test.rb +134 -0
- data/test/test_helper.rb +16 -0
- metadata +147 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# AutoStripAttributes
|
2
|
+
|
3
|
+
AutoStripAttributes helps to remove unnecessary whitespaces from ActiveRecord or ActiveModel attributes.
|
4
|
+
It's good for removing accidental spaces from user inputs (e.g. when user copy/pastes some value to a form and the value has extra spaces at the end).
|
5
|
+
|
6
|
+
It works by adding a before_validation hook to the record. No other methods are added. Gem is kept as simple as possible.
|
7
|
+
|
8
|
+
Gem has option to set empty strings to nil or to remove extra spaces inside the string.
|
9
|
+
|
10
|
+
## Howto / examples
|
11
|
+
|
12
|
+
Include gem in your Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem "auto_strip_attributes", "~> 1.0"
|
16
|
+
```
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
class User < ActiveRecord::Base
|
20
|
+
|
21
|
+
# Normal usage where " aaa bbb\t " changes to "aaa bbb"
|
22
|
+
auto_strip_attributes :nick, :comment
|
23
|
+
|
24
|
+
# Squeezes spaces inside the string: "James Bond " => "James Bond"
|
25
|
+
auto_strip_attributes :name, :squish => true
|
26
|
+
|
27
|
+
# Won't set to null even if string is blank. " " => ""
|
28
|
+
auto_strip_attributes :email, :nullify => false
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
# Support
|
33
|
+
|
34
|
+
Submit suggestions or feature requests as a GitHub Issue or Pull Request. Remember to update tests. Tests are quite extensive.
|
35
|
+
|
36
|
+
## Similar gems
|
37
|
+
|
38
|
+
There are many similar gems. Most of those don't have :squish or :nullify options. Those gems
|
39
|
+
might have some extra methods whereas this gem is kept as simple as possible.
|
40
|
+
|
41
|
+
- https://github.com/phatworx/acts_as_strip
|
42
|
+
- https://github.com/rmm5t/strip_attributes
|
43
|
+
- https://github.com/thomasfedb/attr_cleaner
|
44
|
+
|
45
|
+
# Licence
|
46
|
+
|
47
|
+
Released under the MIT license (http://www.opensource.org/licenses/mit-license.php)
|
48
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "rake/testtask"
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require "bundler/setup"
|
4
|
+
|
5
|
+
desc "Default: run unit tests."
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc "Run tests for gem."
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << "lib" << "test"
|
11
|
+
t.pattern = "test/**/*_test.rb"
|
12
|
+
t.verbose = true
|
13
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "auto_strip_attributes/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "auto_strip_attributes"
|
7
|
+
s.version = AutoStripAttributes::VERSION
|
8
|
+
s.authors = ["Olli Huotari"]
|
9
|
+
s.email = ["olli.huotari@iki.fi"]
|
10
|
+
s.homepage = "https://github.com/holli/auto_strip_attributes"
|
11
|
+
s.summary = "Removes unnecessary whitespaces in attributes. Extension to ActiveRecord or ActiveModel."
|
12
|
+
s.description = "AutoStripAttributes helps to remove unnecessary whitespaces from ActiveRecord or ActiveModel attributes. It's good for removing accidental spaces from user inputs. It works by adding a before_validation hook to the record. It has option to set empty strings to nil or to remove extra spaces inside the string."
|
13
|
+
|
14
|
+
s.rubyforge_project = "auto_strip_attributes"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
|
22
|
+
s.add_runtime_dependency "activemodel", "~> 3.0"
|
23
|
+
|
24
|
+
s.add_development_dependency "activerecord", "~> 3.0"
|
25
|
+
s.add_development_dependency "minitest", "~> 2.5.0"
|
26
|
+
s.add_development_dependency 'ruby-debug'
|
27
|
+
s.add_development_dependency 'rake'
|
28
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "auto_strip_attributes/version"
|
2
|
+
|
3
|
+
module AutoStripAttributes
|
4
|
+
|
5
|
+
def auto_strip_attributes(*attributes)
|
6
|
+
options = {:nullify => true, :squish => false}
|
7
|
+
if attributes.last.is_a?(Hash)
|
8
|
+
options = options.merge(attributes.pop)
|
9
|
+
end
|
10
|
+
|
11
|
+
attributes.each do |attribute|
|
12
|
+
before_validation do |record|
|
13
|
+
value = record.send(attribute)
|
14
|
+
#if value.respond_to?('strip')
|
15
|
+
if value.respond_to?(:strip)
|
16
|
+
value_stripped = (options[:nullify] && value.blank?) ? nil : value.strip
|
17
|
+
|
18
|
+
# gsub(/\s+/, ' ') is same as in Rails#String.squish http://api.rubyonrails.org/classes/String.html#method-i-squish-21
|
19
|
+
value_stripped = value_stripped.gsub(/\s+/, ' ') if options[:squish] && value_stripped.respond_to?(:gsub)
|
20
|
+
|
21
|
+
record[attribute] = value_stripped
|
22
|
+
|
23
|
+
# Alternate way would be to use send(attribute=)
|
24
|
+
# But that would end up calling =-method twice, once when setting, once in before_validate
|
25
|
+
# if (attr != attr_stripped)
|
26
|
+
# record.send("#{attribute}=", value_stripped) # does add some overhead, attribute= will be called before each validation
|
27
|
+
# end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
ActiveRecord::Base.send(:extend, AutoStripAttributes) if defined? ActiveRecord
|
36
|
+
#ActiveModel::Validations::HelperMethods.send(:include, AutoStripAttributes)
|
37
|
+
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require "test/test_helper"
|
2
|
+
# bundle exec ruby test/auto_strip_attributes_test.rb -v --name /test_name/
|
3
|
+
|
4
|
+
#class AutoStripAttributesTest < Test::Unit::TestCase
|
5
|
+
#class AutoStripAttributesTest < MiniTest::Unit::TestCase
|
6
|
+
describe AutoStripAttributes do
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@init_params = { :foo => "\tfoo ", :bar => " bar bar "}
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should have defined AutoStripAttributes" do
|
13
|
+
assert Object.const_defined?(:AutoStripAttributes)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "Basic attribute with default options" do
|
17
|
+
class MockRecordBasic < ActiveRecord::Base
|
18
|
+
column :foo, :string
|
19
|
+
auto_strip_attributes :foo
|
20
|
+
end
|
21
|
+
before do
|
22
|
+
@record = MockRecordBasic.new()
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be ok for normal strings" do
|
26
|
+
@record.foo = " aaa \t"
|
27
|
+
@record.valid?
|
28
|
+
@record.foo.must_equal "aaa"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should set empty strings to nil" do
|
32
|
+
@record.foo = " "
|
33
|
+
@record.valid?
|
34
|
+
@record.foo.must_be_nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should call strip method to attribute if possible" do
|
38
|
+
str_mock = MiniTest::Mock.new()
|
39
|
+
str_mock.expect :'nil?', false
|
40
|
+
str_mock.expect :strip, (@stripped_str="stripped_str_here")
|
41
|
+
@record.foo = str_mock
|
42
|
+
@record.valid?
|
43
|
+
str_mock.verify
|
44
|
+
@record.foo.must_be_same_as @stripped_str
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should not call strip method for non strippable attributes" do
|
48
|
+
str_mock = MiniTest::Mock.new() # answers false to str_mock.respond_to?(:strip)
|
49
|
+
str_mock.expect :'nil?', false
|
50
|
+
@record.foo = str_mock
|
51
|
+
@record.valid?
|
52
|
+
str_mock.verify
|
53
|
+
assert @record.foo === str_mock
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "Attribute with nullify option" do
|
58
|
+
class MockRecordWithNullify < ActiveRecord::Base
|
59
|
+
column :foo, :string
|
60
|
+
auto_strip_attributes :foo, :nullify => false
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should not set blank strings to nil" do
|
64
|
+
@record = MockRecordWithNullify.new
|
65
|
+
@record.foo = " "
|
66
|
+
@record.valid?
|
67
|
+
@record.foo.must_equal ""
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "Attribute with squish option" do
|
72
|
+
class MockRecordWithSqueeze < ActiveRecord::Base
|
73
|
+
column :foo, :string
|
74
|
+
auto_strip_attributes :foo, :squish => true
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should squish string also form inside" do
|
78
|
+
@record = MockRecordWithSqueeze.new
|
79
|
+
@record.foo = " aaa\t\n bbb"
|
80
|
+
@record.valid?
|
81
|
+
@record.foo.must_equal "aaa bbb"
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should do normal nullify with empty string" do
|
85
|
+
@record = MockRecordWithSqueeze.new
|
86
|
+
@record.foo = " "
|
87
|
+
@record.valid?
|
88
|
+
@record.foo.must_be_nil
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "Multible attributes with multiple options" do
|
93
|
+
class MockRecordWithMultipleAttributes < ActiveRecord::Base
|
94
|
+
column :foo, :string
|
95
|
+
column :bar, :string
|
96
|
+
column :biz, :string
|
97
|
+
column :bang, :integer
|
98
|
+
auto_strip_attributes :foo, :bar
|
99
|
+
auto_strip_attributes :biz, {:nullify => false, :squish => true}
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should handle everything ok" do
|
103
|
+
@record = MockRecordWithMultipleAttributes.new
|
104
|
+
@record.foo = " foo\tfoo"
|
105
|
+
@record.bar = " "
|
106
|
+
@record.biz = " "
|
107
|
+
@record.valid?
|
108
|
+
@record.foo.must_equal "foo\tfoo"
|
109
|
+
@record.bar.must_be_nil
|
110
|
+
@record.biz.must_equal ""
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "Attribute with custom setter" do
|
115
|
+
class MockRecordWithCustomSetter < ActiveRecord::Base
|
116
|
+
column :foo, :string
|
117
|
+
auto_strip_attributes :foo
|
118
|
+
|
119
|
+
def foo=(val)
|
120
|
+
self[:foo] = "#{val}-#{val}"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should not call setter again in before_validation" do
|
125
|
+
@record = MockRecordWithCustomSetter.new
|
126
|
+
@record.foo = " foo "
|
127
|
+
@record.foo.must_equal " foo - foo "
|
128
|
+
@record.valid?
|
129
|
+
@record.foo.must_equal "foo - foo"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require "active_record"
|
3
|
+
require "auto_strip_attributes"
|
4
|
+
#require 'ruby-debug'
|
5
|
+
|
6
|
+
class ActiveRecord::Base
|
7
|
+
alias_method :save, :valid?
|
8
|
+
def self.columns()
|
9
|
+
@columns ||= []
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.column(name, sql_type = nil, default = nil, null = true)
|
13
|
+
@columns ||= []
|
14
|
+
@columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type, null)
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: auto_strip_attributes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Olli Huotari
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-08-26 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
prerelease: false
|
22
|
+
type: :runtime
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 7
|
29
|
+
segments:
|
30
|
+
- 3
|
31
|
+
- 0
|
32
|
+
version: "3.0"
|
33
|
+
version_requirements: *id001
|
34
|
+
name: activemodel
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
prerelease: false
|
37
|
+
type: :development
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 7
|
44
|
+
segments:
|
45
|
+
- 3
|
46
|
+
- 0
|
47
|
+
version: "3.0"
|
48
|
+
version_requirements: *id002
|
49
|
+
name: activerecord
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
prerelease: false
|
52
|
+
type: :development
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ~>
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 27
|
59
|
+
segments:
|
60
|
+
- 2
|
61
|
+
- 5
|
62
|
+
- 0
|
63
|
+
version: 2.5.0
|
64
|
+
version_requirements: *id003
|
65
|
+
name: minitest
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
prerelease: false
|
68
|
+
type: :development
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
version_requirements: *id004
|
79
|
+
name: ruby-debug
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
prerelease: false
|
82
|
+
type: :development
|
83
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
hash: 3
|
89
|
+
segments:
|
90
|
+
- 0
|
91
|
+
version: "0"
|
92
|
+
version_requirements: *id005
|
93
|
+
name: rake
|
94
|
+
description: AutoStripAttributes helps to remove unnecessary whitespaces from ActiveRecord or ActiveModel attributes. It's good for removing accidental spaces from user inputs. It works by adding a before_validation hook to the record. It has option to set empty strings to nil or to remove extra spaces inside the string.
|
95
|
+
email:
|
96
|
+
- olli.huotari@iki.fi
|
97
|
+
executables: []
|
98
|
+
|
99
|
+
extensions: []
|
100
|
+
|
101
|
+
extra_rdoc_files: []
|
102
|
+
|
103
|
+
files:
|
104
|
+
- .gitignore
|
105
|
+
- Gemfile
|
106
|
+
- README.md
|
107
|
+
- Rakefile
|
108
|
+
- auto_strip_attributes.gemspec
|
109
|
+
- lib/auto_strip_attributes.rb
|
110
|
+
- lib/auto_strip_attributes/version.rb
|
111
|
+
- test/auto_strip_attributes_test.rb
|
112
|
+
- test/test_helper.rb
|
113
|
+
homepage: https://github.com/holli/auto_strip_attributes
|
114
|
+
licenses: []
|
115
|
+
|
116
|
+
post_install_message:
|
117
|
+
rdoc_options: []
|
118
|
+
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 3
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
version: "0"
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
hash: 3
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
version: "0"
|
139
|
+
requirements: []
|
140
|
+
|
141
|
+
rubyforge_project: auto_strip_attributes
|
142
|
+
rubygems_version: 1.8.6
|
143
|
+
signing_key:
|
144
|
+
specification_version: 3
|
145
|
+
summary: Removes unnecessary whitespaces in attributes. Extension to ActiveRecord or ActiveModel.
|
146
|
+
test_files: []
|
147
|
+
|