nilify_blanks 1.0.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/CHANGELOG.rdoc +9 -0
- data/LICENSE +20 -0
- data/README.rdoc +40 -0
- data/Rakefile +23 -0
- data/init.rb +3 -0
- data/lib/nilify_blanks.rb +48 -0
- data/lib/nilify_blanks/railtie.rb +19 -0
- data/lib/nilify_blanks/version.rb +3 -0
- data/spec/db/database.yml +21 -0
- data/spec/db/schema.rb +12 -0
- data/spec/db/test.sqlite3 +0 -0
- data/spec/nilify_blanks_spec.rb +87 -0
- data/spec/spec_helper.rb +14 -0
- metadata +112 -0
data/CHANGELOG.rdoc
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 [name of plugin creator]
|
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.rdoc
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
== Nilify Blanks
|
2
|
+
|
3
|
+
In Rails when saving a model from a form and values are not provided by the user, an empty string is recorded to the database instead of a NULL as many would prefer (mixing blanks and NULLs can become confusing). This plugin allows you to specify a list of attributes (or exceptions from all the attributes) that will be converted to nil if they are blank before a model is saved.
|
4
|
+
|
5
|
+
Only attributes responding to empty? with a value of true will be converted to nil. Therefore, this does not work with integer fields with the value of 0, for example. Usage is best shown through examples:
|
6
|
+
|
7
|
+
== Install
|
8
|
+
|
9
|
+
Include the gem using bundler in your Gemfile:
|
10
|
+
|
11
|
+
gem "nilify_blanks"
|
12
|
+
|
13
|
+
== Basic Examples
|
14
|
+
|
15
|
+
# Checks and converts all fields in the model
|
16
|
+
class Post < ActiveRecord::Base
|
17
|
+
nilify_blanks
|
18
|
+
end
|
19
|
+
|
20
|
+
# Checks and converts only the title and author fields
|
21
|
+
class Post < ActiveRecord::Base
|
22
|
+
nilify_blanks :only => [:author, :title]
|
23
|
+
end
|
24
|
+
|
25
|
+
# Checks and converts all fields except for title and author
|
26
|
+
class Post < ActiveRecord::Base
|
27
|
+
nilify_blanks :except => [:author, :title]
|
28
|
+
end
|
29
|
+
|
30
|
+
== Specifying a Callback
|
31
|
+
|
32
|
+
Checking uses an ActiveRecord before_save filter by default, but you can specify a different filter with the :before option. Any filter will work - just first remove the "before_" prefix from the name.
|
33
|
+
|
34
|
+
class Post < ActiveRecord::Base
|
35
|
+
nilify_blanks :before => :create
|
36
|
+
end
|
37
|
+
|
38
|
+
class Post < ActiveRecord::Before
|
39
|
+
nilify_blanks :before => :validation_on_update
|
40
|
+
end
|
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
require 'spec/rake/spectask'
|
5
|
+
|
6
|
+
desc "Run specs"
|
7
|
+
Spec::Rake::SpecTask.new do |t|
|
8
|
+
t.spec_files = Rake::FileList["spec/**/*_spec.rb"]
|
9
|
+
t.spec_opts = ["-c"]
|
10
|
+
end
|
11
|
+
|
12
|
+
task :default => :spec
|
13
|
+
|
14
|
+
desc "Generate documentation for the plugin."
|
15
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = "rdoc"
|
17
|
+
rdoc.title = "nilify_blanks"
|
18
|
+
rdoc.options << "--line-numbers" << "--inline-source"
|
19
|
+
rdoc.rdoc_files.include('README')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
Dir["#{File.dirname(__FILE__)}/lib/tasks/*.rake"].sort.each { |ext| load ext }
|
data/init.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module NilifyBlanks
|
2
|
+
def self.included(base)
|
3
|
+
base.extend ClassMethods
|
4
|
+
end
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def nilify_blanks(options = {})
|
8
|
+
return if self.included_modules.include?(NilifyBlanks::InstanceMethods)
|
9
|
+
return unless self.table_exists?
|
10
|
+
|
11
|
+
include NilifyBlanks::InstanceMethods
|
12
|
+
|
13
|
+
if options[:only]
|
14
|
+
options[:only] = [options[:only]] unless options[:only].is_a?(Array)
|
15
|
+
options[:only] = options[:only].map(&:to_s)
|
16
|
+
end
|
17
|
+
|
18
|
+
if options[:except]
|
19
|
+
options[:except] = [options[:except]] unless options[:except].is_a?(Array)
|
20
|
+
options[:except] = options[:except].map(&:to_s)
|
21
|
+
end
|
22
|
+
|
23
|
+
cattr_accessor :nilify_blanks_columns
|
24
|
+
|
25
|
+
self.nilify_blanks_columns = self.content_columns.reject {|c| !c.null }.map {|c| c.name.to_s }
|
26
|
+
self.nilify_blanks_columns = self.nilify_blanks_columns.select {|c| options[:only].include?(c) } if options[:only]
|
27
|
+
self.nilify_blanks_columns -= options[:except] if options[:except]
|
28
|
+
self.nilify_blanks_columns = self.nilify_blanks_columns.map(&:to_s)
|
29
|
+
|
30
|
+
options[:before] ||= :save
|
31
|
+
class_eval "before_#{options[:before]} :nilify_blanks"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
module InstanceMethods
|
36
|
+
def nilify_blanks
|
37
|
+
(self.nilify_blanks_columns || []).each do |column|
|
38
|
+
value = read_attribute(column)
|
39
|
+
next unless value.is_a?(String)
|
40
|
+
next unless value.nil? or !value.respond_to?(:blank)
|
41
|
+
|
42
|
+
write_attribute(column, nil) if value.blank?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
require "nilify_blanks/railtie"
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module NilifyBlanks
|
2
|
+
if defined?(Rails::Railtie)
|
3
|
+
require "rails"
|
4
|
+
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
initializer "nilify_blanks.extend_active_record" do
|
7
|
+
ActiveSupport.on_load(:active_record) do
|
8
|
+
NilifyBlanks::Railtie.insert
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Railtie
|
15
|
+
def self.insert
|
16
|
+
ActiveRecord::Base.send(:include, NilifyBlanks)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
sqlite:
|
2
|
+
adapter: sqlite
|
3
|
+
database: spec/db/test.sqlite
|
4
|
+
|
5
|
+
sqlite3:
|
6
|
+
adapter: sqlite3
|
7
|
+
database: spec/db/test.sqlite3
|
8
|
+
|
9
|
+
postgresql:
|
10
|
+
adapter: postgresql
|
11
|
+
username: postgres
|
12
|
+
password: postgres
|
13
|
+
database: nilify_blanks_plugin_test
|
14
|
+
min_messages: ERROR
|
15
|
+
|
16
|
+
mysql:
|
17
|
+
adapter: mysql
|
18
|
+
host: localhost
|
19
|
+
username: root
|
20
|
+
password:
|
21
|
+
database: nilify_blanks_plugin_test
|
data/spec/db/schema.rb
ADDED
Binary file
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe NilifyBlanks do
|
4
|
+
|
5
|
+
context "Model with nilify_blanks" do
|
6
|
+
before(:all) do
|
7
|
+
class Post < ActiveRecord::Base
|
8
|
+
nilify_blanks
|
9
|
+
end
|
10
|
+
|
11
|
+
@post = Post.new(:first_name => '', :last_name => '', :title => '', :summary => '', :body => '', :views => 0)
|
12
|
+
@post.save
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should recognize all non-null columns" do
|
16
|
+
['first_name', 'title', 'summary', 'body', 'views'].should == Post.nilify_blanks_columns
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should convert all blanks to nils" do
|
20
|
+
@post.first_name.should be_nil
|
21
|
+
@post.title.should be_nil
|
22
|
+
@post.summary.should be_nil
|
23
|
+
@post.body.should be_nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should leave not-null last name field alone" do
|
27
|
+
@post.last_name.should == ""
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should leave integer views field alone" do
|
31
|
+
@post.views.should == 0
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "Model with nilify_blanks :only => [:first_name, :title]" do
|
36
|
+
before(:all) do
|
37
|
+
class PostOnlyFirstNameAndTitle < ActiveRecord::Base
|
38
|
+
set_table_name :posts
|
39
|
+
nilify_blanks :only => [:first_name, :title]
|
40
|
+
end
|
41
|
+
|
42
|
+
@post = PostOnlyFirstNameAndTitle.new(:first_name => '', :last_name => '', :title => '', :summary => '', :body => '', :views => 0)
|
43
|
+
@post.save
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should recognize only first_name and title" do
|
47
|
+
['first_name', 'title'].should == PostOnlyFirstNameAndTitle.nilify_blanks_columns
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should convert first_name and title blanks to nils" do
|
51
|
+
@post.first_name.should be_nil
|
52
|
+
@post.title.should be_nil
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should leave other fields alone" do
|
56
|
+
@post.summary.should == ""
|
57
|
+
@post.body.should == ""
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "Model with nilify_blanks :except => [:first_name, :title]" do
|
62
|
+
before(:all) do
|
63
|
+
class PostExceptFirstNameAndTitle < ActiveRecord::Base
|
64
|
+
set_table_name :posts
|
65
|
+
nilify_blanks :except => [:first_name, :title]
|
66
|
+
end
|
67
|
+
|
68
|
+
@post = PostExceptFirstNameAndTitle.new(:first_name => '', :last_name => '', :title => '', :summary => '', :body => '', :views => 0)
|
69
|
+
@post.save
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should recognize only summary, body, and views" do
|
73
|
+
['summary', 'body', 'views'].should == PostExceptFirstNameAndTitle.nilify_blanks_columns
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should convert summary and body blanks to nils" do
|
77
|
+
@post.summary.should be_nil
|
78
|
+
@post.body.should be_nil
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should leave other fields alone" do
|
82
|
+
@post.first_name.should == ""
|
83
|
+
@post.title.should == ""
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "nilify_blanks"
|
3
|
+
require "active_support"
|
4
|
+
require "active_record"
|
5
|
+
|
6
|
+
# Establish DB Connection
|
7
|
+
config = YAML::load(IO.read(File.join(File.dirname(__FILE__), 'db', 'database.yml')))
|
8
|
+
ActiveRecord::Base.configurations = {'test' => config[ENV['DB'] || 'sqlite3']}
|
9
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
|
10
|
+
|
11
|
+
# Load Test Schema into the Database
|
12
|
+
load(File.dirname(__FILE__) + "/db/schema.rb")
|
13
|
+
|
14
|
+
require File.dirname(__FILE__) + '/../init'
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nilify_blanks
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Ben Hughes
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-10-14 00:00:00 +08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: activesupport
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 7
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 3.0.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: activerecord
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 7
|
46
|
+
segments:
|
47
|
+
- 3
|
48
|
+
- 0
|
49
|
+
- 0
|
50
|
+
version: 3.0.0
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
description: Often times you'll end up with empty strings where you really want nil at the database level. This plugin automatically converts blanks to nil and is configurable.
|
54
|
+
email: ben@railsgarden.com
|
55
|
+
executables: []
|
56
|
+
|
57
|
+
extensions: []
|
58
|
+
|
59
|
+
extra_rdoc_files: []
|
60
|
+
|
61
|
+
files:
|
62
|
+
- lib/nilify_blanks/railtie.rb
|
63
|
+
- lib/nilify_blanks/version.rb
|
64
|
+
- lib/nilify_blanks.rb
|
65
|
+
- spec/db/database.yml
|
66
|
+
- spec/db/schema.rb
|
67
|
+
- spec/db/test.sqlite3
|
68
|
+
- spec/nilify_blanks_spec.rb
|
69
|
+
- spec/spec_helper.rb
|
70
|
+
- CHANGELOG.rdoc
|
71
|
+
- LICENSE
|
72
|
+
- Rakefile
|
73
|
+
- README.rdoc
|
74
|
+
- init.rb
|
75
|
+
has_rdoc: true
|
76
|
+
homepage: http://github.com/rubiety/nilify_blanks
|
77
|
+
licenses: []
|
78
|
+
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
hash: 19
|
99
|
+
segments:
|
100
|
+
- 1
|
101
|
+
- 3
|
102
|
+
- 4
|
103
|
+
version: 1.3.4
|
104
|
+
requirements: []
|
105
|
+
|
106
|
+
rubyforge_project: nilify_blanks
|
107
|
+
rubygems_version: 1.3.7
|
108
|
+
signing_key:
|
109
|
+
specification_version: 3
|
110
|
+
summary: Auto-convert blank fields to nil.
|
111
|
+
test_files: []
|
112
|
+
|