trimify 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "rspec", "~> 2.6.0"
10
+ gem "bundler", "~> 1.0.0"
11
+ gem "jeweler", "~> 1.6.2"
12
+ gem "rcov", ">= 0"
13
+ gem "sqlite3", "~>1.3.0"
14
+ gem "rails", "~>2.3.0"
15
+ end
@@ -0,0 +1,49 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ actionmailer (2.3.9)
5
+ actionpack (= 2.3.9)
6
+ actionpack (2.3.9)
7
+ activesupport (= 2.3.9)
8
+ rack (~> 1.1.0)
9
+ activerecord (2.3.9)
10
+ activesupport (= 2.3.9)
11
+ activeresource (2.3.9)
12
+ activesupport (= 2.3.9)
13
+ activesupport (2.3.9)
14
+ diff-lcs (1.1.2)
15
+ git (1.2.5)
16
+ jeweler (1.6.2)
17
+ bundler (~> 1.0)
18
+ git (>= 1.2.5)
19
+ rake
20
+ rack (1.1.2)
21
+ rails (2.3.9)
22
+ actionmailer (= 2.3.9)
23
+ actionpack (= 2.3.9)
24
+ activerecord (= 2.3.9)
25
+ activeresource (= 2.3.9)
26
+ activesupport (= 2.3.9)
27
+ rake (>= 0.8.3)
28
+ rake (0.8.7)
29
+ rcov (0.9.9)
30
+ rspec (2.6.0)
31
+ rspec-core (~> 2.6.0)
32
+ rspec-expectations (~> 2.6.0)
33
+ rspec-mocks (~> 2.6.0)
34
+ rspec-core (2.6.4)
35
+ rspec-expectations (2.6.0)
36
+ diff-lcs (~> 1.1.2)
37
+ rspec-mocks (2.6.0)
38
+ sqlite3 (1.3.3)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ bundler (~> 1.0.0)
45
+ jeweler (~> 1.6.2)
46
+ rails (~> 2.3.0)
47
+ rcov
48
+ rspec (~> 2.6.0)
49
+ sqlite3 (~> 1.3.0)
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Behrang Saeedzadeh
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.
@@ -0,0 +1,28 @@
1
+ =Trimify
2
+
3
+ Trimify is an ActiveRecord Plugin that allows you to easily trim leading and trailing white spaces from string attributes and optionally turn blank strings to nil.
4
+ Only attributes you specify will be checked and converted. Using trimify on non-string attributes has no effect.
5
+
6
+ ==Installation
7
+
8
+ gem install trimify
9
+
10
+ ==Example
11
+
12
+ class User < ActiveRecord::Base
13
+ trimify :first_name, :middle_name
14
+ trimify :last_name, :nilify => false # default value of :nilify is true
15
+ end
16
+
17
+ user = User.create(:first_name => " Shompet ", :middle_name = "", :last_name => "")
18
+ user.first_name # => "Shompet"
19
+ user.middle_name # => nil
20
+ user.last_name # => ""
21
+
22
+ ==Acknowledgments
23
+
24
+ Trimify is inspired by the Nilify plugin written by Tobias Schmidt.
25
+
26
+ == Copyright
27
+
28
+ Copyright (c) 2011 Behrang Saeedzadeh, released under the MIT license.
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "trimify"
18
+ gem.homepage = "http://github.com/behrangsa/trimify"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{A gem for trimming strings in active record models.}
21
+ gem.description = %Q{A gem for trimming strings and optionally turning blank strings to nil}
22
+ gem.email = "behrangsa@gmail.com"
23
+ gem.authors = ["Behrang Saeedzadeh"]
24
+ gem.version = File.read('VERSION').chomp
25
+ # dependencies defined in Gemfile
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rspec/core'
30
+ require 'rspec/core/rake_task'
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ end
34
+
35
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
36
+ spec.pattern = 'spec/**/*_spec.rb'
37
+ spec.rcov = true
38
+ end
39
+
40
+ task :default => :spec
41
+
42
+ require 'rake/rdoctask'
43
+ Rake::RDocTask.new do |rdoc|
44
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
45
+
46
+ rdoc.rdoc_dir = 'rdoc'
47
+ rdoc.title = "trimify #{version}"
48
+ rdoc.rdoc_files.include('README*')
49
+ rdoc.rdoc_files.include('lib/**/*.rb')
50
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,50 @@
1
+ module Behi
2
+ module Trimify
3
+
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ def trimify(*args)
10
+ return if args.empty?
11
+ return unless table_exists?
12
+
13
+ options = { :nilify => true }
14
+ options.merge!(args.pop) if args.last.kind_of? Hash
15
+
16
+ unless self.included_modules.include?(Trimify::InstanceMethods)
17
+ include Trimify::InstanceMethods
18
+ write_inheritable_attribute :trimify_attributes, {}
19
+ class_inheritable_reader :trimify_attributes
20
+ end
21
+
22
+ attributes = args.map(&:to_sym)
23
+ col_options = {}
24
+ columns = content_columns.reject { |c| c.type != :string }.map { |c| c.name.to_sym }.select { |c| args.include?(c) }
25
+ columns.each { |col| col_options[col] = options }
26
+ write_inheritable_hash :trimify_attributes, col_options
27
+
28
+ class_eval "before_validation :trimify"
29
+ end
30
+ end
31
+
32
+ module InstanceMethods
33
+ def trimify
34
+ self.class.trimify_attributes.each do |attribute, options|
35
+ value = read_attribute(attribute)
36
+ if value.is_a?(String)
37
+ value.strip!
38
+ value = nil if (value.blank? && options[:nilify] == true)
39
+ write_attribute(attribute, value)
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ end
46
+ end
47
+
48
+ class ActiveRecord::Base
49
+ include Behi::Trimify
50
+ end
@@ -0,0 +1,4 @@
1
+ class Category < ActiveRecord::Base
2
+ trimify :title
3
+ trimify :description
4
+ end
@@ -0,0 +1,3 @@
1
+ class NoTable < ActiveRecord::Base
2
+ trimify :attrib
3
+ end
@@ -0,0 +1,3 @@
1
+ class Post < ActiveRecord::Base
2
+ trimify
3
+ end
@@ -0,0 +1,19 @@
1
+ ActiveRecord::Schema.define do
2
+
3
+ create_table :users, :force => true do |t|
4
+ t.string :first_name, :not_null, :type
5
+ t.string :middle_name, :not_null, :type
6
+ t.string :last_name, :not_null, :type
7
+ t.integer :salary
8
+ t.datetime :birthday
9
+ end
10
+
11
+ create_table :posts, :force => true do |t|
12
+ t.string :name
13
+ end
14
+
15
+ create_table :categories, :force => true do |t|
16
+ t.string :title, :description
17
+ end
18
+
19
+ end
@@ -0,0 +1,2 @@
1
+ class SpecializedUser < User
2
+ end
@@ -0,0 +1,4 @@
1
+ class User < ActiveRecord::Base
2
+ trimify :first_name, :middle_name
3
+ trimify :last_name, :nilify => false
4
+ end
@@ -0,0 +1,15 @@
1
+ require "rubygems"
2
+ require "rspec"
3
+ require "sqlite3"
4
+ require "active_record"
5
+
6
+ # load nilify
7
+ require File.dirname(__FILE__) + '/../lib/trimify'
8
+
9
+ # establish database connection, define schema and load model
10
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
11
+ ActiveRecord::Migration.verbose = false
12
+
13
+ %w(schema category post user specialized_user).each do |file|
14
+ require File.dirname(__FILE__) + "/fixtures/#{file}"
15
+ end
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Behi::Trimify do
4
+
5
+ it "should add a class method to activerecord" do
6
+ User.methods.should include("trimify")
7
+ end
8
+
9
+ it "should allow multiple trimify calls" do
10
+ Category.trimify_attributes.should == { :title => { :nilify => true }, :description => { :nilify => true } }
11
+ end
12
+
13
+ it "should bequest trimify attributes" do
14
+ SpecializedUser.trimify_attributes.should == {
15
+ :first_name => { :nilify => true },
16
+ :middle_name => { :nilify => true },
17
+ :last_name => { :nilify => false }
18
+ }
19
+ end
20
+
21
+ it "should not raise an exception for a non existing table" do
22
+ expect { require "fixtures/no_table" }.to_not raise_error(ActiveRecord::StatementInvalid)
23
+ end
24
+
25
+ describe "when trimifying possible attributes" do
26
+ before(:each) do
27
+ @user = User.new(:first_name => " Shompet ", :middle_name => " ", :last_name => "", :salary => 0, :birthday => Time.at(0))
28
+ @user.valid?
29
+ end
30
+
31
+ it "should trim leading and trailing white spaces" do
32
+ @user.first_name.should == "Shompet"
33
+ end
34
+
35
+ it "should nilify strings that are trimmed down to a blank string" do
36
+ @user.middle_name.should be_nil
37
+ end
38
+
39
+ it "should not nilify strings that are trimmed down to a blank string if :nilify is set to false" do
40
+ @user.last_name.should == ""
41
+ end
42
+
43
+ it "should not nilify not specified values" do
44
+ user = User.new(:not_null => "")
45
+ user.valid?
46
+ user.not_null.should == ""
47
+ end
48
+ end
49
+
50
+ describe "when calling nilify without attributes" do
51
+ it "should do nothing" do
52
+ post = Post.new(:name => "")
53
+ post.valid?
54
+ post.name.should == ""
55
+ end
56
+ end
57
+
58
+ end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trimify
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Behrang Saeedzadeh
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-06-08 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ hash: 23
28
+ segments:
29
+ - 2
30
+ - 6
31
+ - 0
32
+ version: 2.6.0
33
+ prerelease: false
34
+ type: :development
35
+ requirement: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: bundler
38
+ version_requirements: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 23
44
+ segments:
45
+ - 1
46
+ - 0
47
+ - 0
48
+ version: 1.0.0
49
+ prerelease: false
50
+ type: :development
51
+ requirement: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: jeweler
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ hash: 11
60
+ segments:
61
+ - 1
62
+ - 6
63
+ - 2
64
+ version: 1.6.2
65
+ prerelease: false
66
+ type: :development
67
+ requirement: *id003
68
+ - !ruby/object:Gem::Dependency
69
+ name: rcov
70
+ version_requirements: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ prerelease: false
80
+ type: :development
81
+ requirement: *id004
82
+ - !ruby/object:Gem::Dependency
83
+ name: sqlite3
84
+ version_requirements: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ hash: 27
90
+ segments:
91
+ - 1
92
+ - 3
93
+ - 0
94
+ version: 1.3.0
95
+ prerelease: false
96
+ type: :development
97
+ requirement: *id005
98
+ - !ruby/object:Gem::Dependency
99
+ name: rails
100
+ version_requirements: &id006 !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ~>
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 2
108
+ - 3
109
+ - 0
110
+ version: 2.3.0
111
+ prerelease: false
112
+ type: :development
113
+ requirement: *id006
114
+ description: A gem for trimming strings and optionally turning blank strings to nil
115
+ email: behrangsa@gmail.com
116
+ executables: []
117
+
118
+ extensions: []
119
+
120
+ extra_rdoc_files:
121
+ - README.rdoc
122
+ files:
123
+ - Gemfile
124
+ - Gemfile.lock
125
+ - MIT-LICENSE
126
+ - README.rdoc
127
+ - Rakefile
128
+ - VERSION
129
+ - lib/trimify.rb
130
+ - spec/fixtures/category.rb
131
+ - spec/fixtures/no_table.rb
132
+ - spec/fixtures/post.rb
133
+ - spec/fixtures/schema.rb
134
+ - spec/fixtures/specialized_user.rb
135
+ - spec/fixtures/user.rb
136
+ - spec/spec_helper.rb
137
+ - spec/trimify_spec.rb
138
+ homepage: http://github.com/behrangsa/trimify
139
+ licenses:
140
+ - MIT
141
+ post_install_message:
142
+ rdoc_options: []
143
+
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ none: false
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ hash: 3
152
+ segments:
153
+ - 0
154
+ version: "0"
155
+ required_rubygems_version: !ruby/object:Gem::Requirement
156
+ none: false
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ hash: 3
161
+ segments:
162
+ - 0
163
+ version: "0"
164
+ requirements: []
165
+
166
+ rubyforge_project:
167
+ rubygems_version: 1.8.5
168
+ signing_key:
169
+ specification_version: 3
170
+ summary: A gem for trimming strings in active record models.
171
+ test_files: []
172
+