attribute_normalizer 0.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.
- data/MIT-LICENSE +20 -0
- data/README.textile +61 -0
- data/Rakefile +50 -0
- data/lib/attribute_normalizer.rb +39 -0
- data/rails/init.rb +2 -0
- data/spec/attribute_normalizer_spec.rb +94 -0
- data/spec/test_helper.rb +9 -0
- metadata +62 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Michael Deering
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.textile
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
h1. Attribute Normalizer
|
2
|
+
|
3
|
+
p. I like to keep my Active Record models as strict as possible but I also like the further layer of protection/restriction setting database columns to not allow NULL adds. Normalizing to nil helps enforce this better by not letting '' slip through the cracks and I can still prevent those who insist on direct DB access from entering in shitty data as much as possible.
|
4
|
+
|
5
|
+
h2. Install as a Ruby gem
|
6
|
+
|
7
|
+
TODO: gem-er-a-size this!
|
8
|
+
|
9
|
+
h2. Install as a Ruby on Rails Plugin
|
10
|
+
|
11
|
+
The traditional way.
|
12
|
+
|
13
|
+
./script/plugin install git://github.com/mdeering/attribute_normalizer.git
|
14
|
+
|
15
|
+
or the old-school but still c00l way!
|
16
|
+
|
17
|
+
piston import git://github.com/mdeering/attribute_normalizer.git vendor/plugins/attribute_normalizer
|
18
|
+
|
19
|
+
or for all you hip gitsters.
|
20
|
+
|
21
|
+
git submodule add git://github.com/mdeering/attribute_normalizer.git vendor/plugins/attribute_normalizer
|
22
|
+
git submodule init
|
23
|
+
|
24
|
+
h2. Usage
|
25
|
+
|
26
|
+
This is eager loaded into Active Record. It is usable inside of other ruby classes outside of ActiveRecord by just including the module AttributeNormalizer.
|
27
|
+
|
28
|
+
<pre><code>
|
29
|
+
class Klass < ActiveRecord::Base
|
30
|
+
|
31
|
+
# Can take an array of attributes if you want
|
32
|
+
normalize_attributes :first_name, :last_name
|
33
|
+
|
34
|
+
normalize_attributes :home_phone_number, :office_phone_number_ do |value|
|
35
|
+
return nil unless value.is_a?(String)
|
36
|
+
value.gsub(/\W/, '').gsub(/^1/, '')
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
object = Klass.new
|
42
|
+
# Blank normalizes to nil
|
43
|
+
object.first_name = ''
|
44
|
+
object.first_name # => nil
|
45
|
+
|
46
|
+
# Whitespace is cleaned up
|
47
|
+
object.last_name = "\tDeering\n"
|
48
|
+
object.last_name # => 'Deering'
|
49
|
+
|
50
|
+
# Your given block will be executed to normalize
|
51
|
+
object.home_phone_number = '+1 (555) 123.4567'
|
52
|
+
object.home_phone_number # => '5551234567'
|
53
|
+
</code></pre>
|
54
|
+
|
55
|
+
h2. Credits
|
56
|
+
|
57
|
+
Original module code and concept was taken from "Dan Kubb":http://github.com/dkubb during a project we worked on together. I found that I was consistently using this across all my projects so I wanted to plugin-er-size and gem this up for easy reuse.
|
58
|
+
|
59
|
+
h2. Copyright
|
60
|
+
|
61
|
+
Copyright (c) 2009 "Michael Deering(Edmonton Ruby on Rails)":http://mdeering.com See MIT-LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
require 'spec/rake/spectask'
|
4
|
+
|
5
|
+
begin
|
6
|
+
AUTHOR = "Michael Deering"
|
7
|
+
EMAIL = "mdeering@mdeering.com"
|
8
|
+
GEM = "attribute_normalizer"
|
9
|
+
HOMEPAGE = "http://github.com/mdeering/attribute_normalizer"
|
10
|
+
SUMMARY = "Active Record attribute normalizer that excepts code blocks."
|
11
|
+
|
12
|
+
require 'jeweler'
|
13
|
+
Jeweler::Tasks.new do |s|
|
14
|
+
s.author = AUTHOR
|
15
|
+
s.email = EMAIL
|
16
|
+
s.files = %w(MIT-LICENSE README.textile Rakefile) + Dir.glob("{rails,lib,spec}/**/*")
|
17
|
+
s.homepage = HOMEPAGE
|
18
|
+
s.name = GEM
|
19
|
+
s.require_path = 'lib'
|
20
|
+
s.summary = SUMMARY
|
21
|
+
end
|
22
|
+
Jeweler::GemcutterTasks.new
|
23
|
+
rescue LoadError
|
24
|
+
puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'Default: spec tests.'
|
28
|
+
task :default => :spec
|
29
|
+
|
30
|
+
desc 'Test the attribute_normalizer plugin.'
|
31
|
+
Spec::Rake::SpecTask.new('spec') do |t|
|
32
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
33
|
+
t.spec_opts = ["-c"]
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Run all examples with RCov"
|
37
|
+
Spec::Rake::SpecTask.new('examples_with_rcov') do |t|
|
38
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
39
|
+
t.rcov = true
|
40
|
+
t.rcov_opts = ['--exclude', '/opt,spec,Library']
|
41
|
+
end
|
42
|
+
|
43
|
+
desc 'Generate documentation for the attribute_normalizer plugin.'
|
44
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
45
|
+
rdoc.rdoc_dir = 'rdoc'
|
46
|
+
rdoc.title = 'AttributeNormalizer'
|
47
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
48
|
+
rdoc.rdoc_files.include('README.textile')
|
49
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
50
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module AttributeNormalizer
|
2
|
+
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
|
9
|
+
def normalize_attributes(*attributes, &block)
|
10
|
+
|
11
|
+
attributes.each do |attribute|
|
12
|
+
|
13
|
+
klass = class << self; self end
|
14
|
+
|
15
|
+
klass.send :define_method, "normalize_#{attribute}" do |value|
|
16
|
+
value = value.strip if value.is_a?(String)
|
17
|
+
normalized = block_given? && !value.blank? ? yield(value) : value
|
18
|
+
normalized.nil? || (normalized.is_a?(String) && normalized == '') ? nil : normalized
|
19
|
+
end
|
20
|
+
|
21
|
+
klass.send :private, "normalize_#{attribute}"
|
22
|
+
|
23
|
+
src = <<-end_src
|
24
|
+
def #{attribute}
|
25
|
+
@#{attribute} ||= self.class.send(:normalize_#{attribute}, self[:#{attribute}]) unless self[:#{attribute}].nil?
|
26
|
+
end
|
27
|
+
|
28
|
+
def #{attribute}=(#{attribute})
|
29
|
+
@#{attribute} = self[:#{attribute}] = self.class.send(:normalize_#{attribute}, #{attribute})
|
30
|
+
end
|
31
|
+
end_src
|
32
|
+
|
33
|
+
module_eval src, __FILE__, __LINE__
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
require 'attribute_normalizer'
|
3
|
+
|
4
|
+
describe AttributeNormalizer do
|
5
|
+
|
6
|
+
it 'should add the class method Class#normalize_attributes when included' do
|
7
|
+
|
8
|
+
klass = Class.new do
|
9
|
+
include AttributeNormalizer
|
10
|
+
end
|
11
|
+
|
12
|
+
klass.respond_to?(:normalize_attributes).should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#normalize_attributes without a block' do
|
18
|
+
|
19
|
+
before do
|
20
|
+
|
21
|
+
class Klass
|
22
|
+
attr_accessor :attribute
|
23
|
+
include AttributeNormalizer
|
24
|
+
normalize_attributes :attribute
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
{
|
30
|
+
' spaces in front and back ' => 'spaces in front and back',
|
31
|
+
"\twe hate tabs!\t" => 'we hate tabs!'
|
32
|
+
}.each do |key, value|
|
33
|
+
it "should normalize '#{key}' to '#{value}'" do
|
34
|
+
Klass.send(:normalize_attribute, key).should == value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#normalize_attributes with a block' do
|
41
|
+
|
42
|
+
before do
|
43
|
+
|
44
|
+
class Klass
|
45
|
+
attr_accessor :attribute
|
46
|
+
include AttributeNormalizer
|
47
|
+
normalize_attributes :attribute do |value|
|
48
|
+
value = value.strip.upcase if value.is_a?(String)
|
49
|
+
value = value * 2 if value.is_a?(Fixnum)
|
50
|
+
value = value * 0.5 if value.is_a?(Float)
|
51
|
+
value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
@object = Klass.new
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
{
|
60
|
+
"\tMichael Deering" => 'MICHAEL DEERING',
|
61
|
+
2 => 4,
|
62
|
+
2.0 => 1.0
|
63
|
+
}.each do |key, value|
|
64
|
+
it "should normalize '#{key}' to '#{value}'" do
|
65
|
+
Klass.send(:normalize_attribute, key).should == value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'with an instance' do
|
72
|
+
|
73
|
+
before do
|
74
|
+
class Klass
|
75
|
+
attr_accessor :attribute
|
76
|
+
include AttributeNormalizer
|
77
|
+
normalize_attributes :attribute
|
78
|
+
end
|
79
|
+
|
80
|
+
@object = Klass.new
|
81
|
+
end
|
82
|
+
|
83
|
+
{
|
84
|
+
' spaces in front and back ' => 'spaces in front and back',
|
85
|
+
"\twe hate tabs!\t" => 'we hate tabs!'
|
86
|
+
}.each do |key, value|
|
87
|
+
it "should normalize '#{key}' to '#{value}'" do
|
88
|
+
@object.send('attribute=', key)
|
89
|
+
@object.send(:attribute).should == value
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
end
|
data/spec/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: attribute_normalizer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michael Deering
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-01-01 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: mdeering@mdeering.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.textile
|
24
|
+
files:
|
25
|
+
- MIT-LICENSE
|
26
|
+
- README.textile
|
27
|
+
- Rakefile
|
28
|
+
- lib/attribute_normalizer.rb
|
29
|
+
- rails/init.rb
|
30
|
+
- spec/attribute_normalizer_spec.rb
|
31
|
+
- spec/test_helper.rb
|
32
|
+
has_rdoc: true
|
33
|
+
homepage: http://github.com/mdeering/attribute_normalizer
|
34
|
+
licenses: []
|
35
|
+
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options:
|
38
|
+
- --charset=UTF-8
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
version:
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: "0"
|
52
|
+
version:
|
53
|
+
requirements: []
|
54
|
+
|
55
|
+
rubyforge_project:
|
56
|
+
rubygems_version: 1.3.5
|
57
|
+
signing_key:
|
58
|
+
specification_version: 3
|
59
|
+
summary: Active Record attribute normalizer that excepts code blocks.
|
60
|
+
test_files:
|
61
|
+
- spec/attribute_normalizer_spec.rb
|
62
|
+
- spec/test_helper.rb
|