nilly_vanilly 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/README.markdown ADDED
@@ -0,0 +1,51 @@
1
+ NillyVanilly
2
+ ============
3
+
4
+ This plugin stores NULL in your database when you try to store an empty string.
5
+
6
+ It only works for columns you explicitly mention inside your model. It comes
7
+ with a rake task which prints out all the columns eligible for nillification.
8
+
9
+ Since HTTP parameters are always strings, an empty string is sent by form
10
+ values for which you did not mean to enter any value. This plugin makes sure
11
+ to save NULL in database varchar columns that are defined with DEFAULT NULL.
12
+
13
+
14
+ Example
15
+ =======
16
+
17
+ class Comment < ActiveRecord::Base
18
+ nillify :author_url
19
+ end
20
+
21
+ comment = Comment.create :author_url => ""
22
+ comment.author_url # -> nil
23
+
24
+
25
+ Installation
26
+ ============
27
+
28
+ ./script/plugin install git://github.com/tilsammans/nilly_vanilly.git
29
+
30
+
31
+ Inspection
32
+ ==========
33
+
34
+ To see what columns are eligible for nillification, run the following:
35
+
36
+ rake nilly:vanilly:inspect
37
+
38
+ This will print a list of all tables in your database, cross-referenced with
39
+ the models in your application. All text columns which may be NULL and are
40
+ nil by default are shown, i.e. all these columns should be safe to nillify.
41
+ This does not take into account any validations you might have.
42
+
43
+ When a column has already been nillified, it will be indicated with [OK].
44
+
45
+
46
+ Author
47
+ ======
48
+
49
+ Joost Baaij
50
+ <joost@spacebabies.nl>
51
+ [www.spacebabies.nl](http://www.spacebabies.nl/)
data/Rakefile ADDED
@@ -0,0 +1,63 @@
1
+ require 'rake'
2
+ require 'rake/rdoctask'
3
+
4
+ desc 'Default: run specs.'
5
+ task :default => :spec
6
+
7
+ require 'jeweler'
8
+ Jeweler::Tasks.new do |gem|
9
+ gem.name = "nilly_vanilly"
10
+ gem.homepage = "http://github.com/tilsammans/nilly_vanilly"
11
+ gem.summary = %Q{This plugin stores NULL in your database when you try to store an empty string.}
12
+ gem.email = "joost@spacebabies.nl"
13
+ gem.authors = ["Joost Baaij"]
14
+ gem.add_runtime_dependency 'activerecord', '~> 2.3'
15
+ gem.add_development_dependency 'rspec', '~> 1.3.1'
16
+ gem.add_development_dependency 'jeweler', '~> 0.5.2'
17
+ end
18
+ Jeweler::RubygemsDotOrgTasks.new
19
+
20
+ begin
21
+ # Rspec 1.3.0
22
+ require 'spec/rake/spectask'
23
+
24
+ desc 'Default: run specs'
25
+ task :default => :spec
26
+ Spec::Rake::SpecTask.new do |t|
27
+ t.spec_files = FileList["spec/**/*_spec.rb"]
28
+ end
29
+
30
+ Spec::Rake::SpecTask.new('rcov') do |t|
31
+ t.spec_files = FileList["spec/**/*_spec.rb"]
32
+ t.rcov = true
33
+ t.rcov_opts = ['--exclude', 'spec']
34
+ end
35
+
36
+ rescue LoadError
37
+ # Rspec 2.0
38
+ require 'rspec/core/rake_task'
39
+
40
+ desc 'Default: run specs'
41
+ task :default => :spec
42
+ Rspec::Core::RakeTask.new do |t|
43
+ t.pattern = "spec/**/*_spec.rb"
44
+ end
45
+
46
+ Rspec::Core::RakeTask.new('rcov') do |t|
47
+ t.pattern = "spec/**/*_spec.rb"
48
+ t.rcov = true
49
+ t.rcov_opts = ['--exclude', 'spec']
50
+ end
51
+
52
+ rescue LoadError
53
+ puts "Rspec not available. Install it with: gem install rspec"
54
+ end
55
+
56
+ desc 'Generate documentation for the nilly_vanilly plugin.'
57
+ Rake::RDocTask.new(:rdoc) do |rdoc|
58
+ rdoc.rdoc_dir = 'rdoc'
59
+ rdoc.title = 'NillyVanilly'
60
+ rdoc.options << '--line-numbers' << '--inline-source'
61
+ rdoc.rdoc_files.include('README')
62
+ rdoc.rdoc_files.include('lib/**/*.rb')
63
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,6 @@
1
+ require "active_record"
2
+ require 'nilly_vanilly/nillify'
3
+
4
+ if defined?(ActiveRecord::Base)
5
+ ActiveRecord::Base.send :include, NillyVanilly::Nillify
6
+ end
@@ -0,0 +1,28 @@
1
+ module NillyVanilly
2
+ module Nillify
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def nillify(*attributes)
9
+ class_eval do
10
+ before_save :nillification
11
+ end
12
+
13
+ cattr_accessor :nillify_attributes
14
+ self.nillify_attributes = attributes
15
+
16
+ include InstanceMethods
17
+ end
18
+ end
19
+
20
+ module InstanceMethods
21
+ def nillification
22
+ for attribute in self.class.nillify_attributes
23
+ self.send("#{attribute}=", nil) if self.send(attribute) == ""
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ namespace :nilly do
2
+ namespace :vanilly do
3
+ task :inspect => :environment do
4
+ ActiveRecord::Base.connection.tables.each do |table|
5
+ model = table.classify.constantize rescue next
6
+
7
+ model.columns.each do |column|
8
+ if model.respond_to?(:nillify_attributes) && model.nillify_attributes.include?(column.name.to_sym)
9
+ present = "[OK]"
10
+ else
11
+ present = "[ ]"
12
+ end
13
+
14
+ if column.text? && column.null && column.default.nil?
15
+ puts [present, model.name.ljust(20), column.name].join(" ")
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'nilly_vanilly'
data/spec/database.yml ADDED
@@ -0,0 +1,17 @@
1
+ sqlite3:
2
+ adapter: sqlite3
3
+ database: nilly_vanilly.sqlite3
4
+
5
+ mysql:
6
+ adapter: mysql
7
+ hostname: localhost
8
+ username: root
9
+ password:
10
+ database: nilly_vanilly
11
+
12
+ postgresql:
13
+ adapter: postgresql
14
+ hostname: localhost
15
+ username: postgres
16
+ password:
17
+ database: nilly_vanilly
data/spec/models.rb ADDED
@@ -0,0 +1,7 @@
1
+ class Post < ActiveRecord::Base
2
+ nillify :title
3
+ end
4
+
5
+ class Comment < ActiveRecord::Base
6
+ nillify :author, :author_email
7
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe NillyVanilly do
4
+ describe "model with one column" do
5
+ it "stores class methods" do
6
+ Post.nillify_attributes.should == [:title]
7
+ end
8
+
9
+ it "stores nil for empty string" do
10
+ post = Post.create! :title => ""
11
+ post.title.should be_nil
12
+ end
13
+ end
14
+
15
+ describe "model with two columns" do
16
+ it "stores class methods" do
17
+ Comment.nillify_attributes.should == [:author, :author_email]
18
+ end
19
+ end
20
+ end
data/spec/schema.rb ADDED
@@ -0,0 +1,10 @@
1
+ ActiveRecord::Schema.define(:version => 0) do
2
+ create_table :posts, :force => true do |t|
3
+ t.string :title, :default => nil, :null => true
4
+ end
5
+
6
+ create_table :comments, :force => true do |t|
7
+ t.string :author, :default => nil, :null => true
8
+ t.string :author_email, :default => nil, :null => true
9
+ end
10
+ end
@@ -0,0 +1,32 @@
1
+ $LOAD_PATH << "." unless $LOAD_PATH.include?(".")
2
+
3
+ require 'yaml'
4
+ require File.dirname(__FILE__) + '/../rails/init.rb'
5
+
6
+ ENV['DB'] ||= 'sqlite3'
7
+
8
+ database_yml = File.expand_path('../database.yml', __FILE__)
9
+ if File.exists?(database_yml)
10
+ active_record_configuration = YAML.load_file(database_yml)[ENV['DB']]
11
+
12
+ ActiveRecord::Base.establish_connection(active_record_configuration)
13
+ ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
14
+
15
+ ActiveRecord::Base.silence do
16
+ ActiveRecord::Migration.verbose = false
17
+
18
+ load(File.dirname(__FILE__) + '/schema.rb')
19
+ load(File.dirname(__FILE__) + '/models.rb')
20
+ end
21
+
22
+ else
23
+ raise "Please create #{database_yml} first to configure your database. Take a look at: #{database_yml}.sample"
24
+ end
25
+
26
+ def clean_database!
27
+ [Post, Comment].each do |model|
28
+ ActiveRecord::Base.connection.execute "DELETE FROM #{model.table_name}"
29
+ end
30
+ end
31
+
32
+ clean_database!
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nilly_vanilly
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Joost Baaij
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-01-21 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: activerecord
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 5
30
+ segments:
31
+ - 2
32
+ - 3
33
+ version: "2.3"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 25
45
+ segments:
46
+ - 1
47
+ - 3
48
+ - 1
49
+ version: 1.3.1
50
+ type: :development
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: jeweler
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 15
61
+ segments:
62
+ - 0
63
+ - 5
64
+ - 2
65
+ version: 0.5.2
66
+ type: :development
67
+ version_requirements: *id003
68
+ description:
69
+ email: joost@spacebabies.nl
70
+ executables: []
71
+
72
+ extensions: []
73
+
74
+ extra_rdoc_files:
75
+ - README.markdown
76
+ files:
77
+ - README.markdown
78
+ - Rakefile
79
+ - VERSION
80
+ - lib/nilly_vanilly.rb
81
+ - lib/nilly_vanilly/nillify.rb
82
+ - lib/tasks/nilly_vanilly.rake
83
+ - rails/init.rb
84
+ - spec/database.yml
85
+ - spec/models.rb
86
+ - spec/nilly_vanilly_spec.rb
87
+ - spec/schema.rb
88
+ - spec/spec_helper.rb
89
+ has_rdoc: true
90
+ homepage: http://github.com/tilsammans/nilly_vanilly
91
+ licenses: []
92
+
93
+ post_install_message:
94
+ rdoc_options: []
95
+
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
105
+ - 0
106
+ version: "0"
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ hash: 3
113
+ segments:
114
+ - 0
115
+ version: "0"
116
+ requirements: []
117
+
118
+ rubyforge_project:
119
+ rubygems_version: 1.3.7
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: This plugin stores NULL in your database when you try to store an empty string.
123
+ test_files:
124
+ - spec/models.rb
125
+ - spec/nilly_vanilly_spec.rb
126
+ - spec/schema.rb
127
+ - spec/spec_helper.rb