validates_lengths_from_database 0.1.3 → 0.2.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/Appraisals ADDED
@@ -0,0 +1,20 @@
1
+ appraise "rails-2.3" do
2
+ gem "rails", "~> 2.3.2"
3
+ gem "validates_lengths_from_database", :path => "../"
4
+ end
5
+
6
+ appraise "rails-3.0" do
7
+ gem "rails", "~> 3.0.12"
8
+ gem "validates_lengths_from_database", :path => "../"
9
+ end
10
+
11
+ appraise "rails-3.1" do
12
+ gem "rails", "~> 3.1.4"
13
+ gem "validates_lengths_from_database", :path => "../"
14
+ end
15
+
16
+ appraise "rails-3.2" do
17
+ gem "rails", "~> 3.2.2"
18
+ gem "validates_lengths_from_database", :path => "../"
19
+ end
20
+
data/Gemfile.lock CHANGED
@@ -1,26 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- validates_lengths_from_database (0.1.2)
4
+ validates_lengths_from_database (0.1.3)
5
5
  activerecord (>= 2.3.2)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- activemodel (3.0.6)
11
- activesupport (= 3.0.6)
12
- builder (~> 2.1.2)
13
- i18n (~> 0.5.0)
14
- activerecord (3.0.6)
15
- activemodel (= 3.0.6)
16
- activesupport (= 3.0.6)
17
- arel (~> 2.0.2)
18
- tzinfo (~> 0.3.23)
19
- activesupport (3.0.6)
20
- arel (2.0.9)
21
- builder (2.1.2)
10
+ activemodel (3.2.2)
11
+ activesupport (= 3.2.2)
12
+ builder (~> 3.0.0)
13
+ activerecord (3.2.2)
14
+ activemodel (= 3.2.2)
15
+ activesupport (= 3.2.2)
16
+ arel (~> 3.0.2)
17
+ tzinfo (~> 0.3.29)
18
+ activesupport (3.2.2)
19
+ i18n (~> 0.6)
20
+ multi_json (~> 1.0)
21
+ appraisal (0.4.1)
22
+ bundler
23
+ rake
24
+ arel (3.0.2)
25
+ builder (3.0.0)
22
26
  diff-lcs (1.1.2)
23
- i18n (0.5.0)
27
+ i18n (0.6.0)
28
+ json (1.6.6)
29
+ multi_json (1.2.0)
30
+ rake (0.9.2.2)
31
+ rdoc (3.12)
32
+ json (~> 1.4)
24
33
  rspec (2.5.0)
25
34
  rspec-core (~> 2.5.0)
26
35
  rspec-expectations (~> 2.5.0)
@@ -29,16 +38,17 @@ GEM
29
38
  rspec-expectations (2.5.0)
30
39
  diff-lcs (~> 1.1.2)
31
40
  rspec-mocks (2.5.0)
32
- sqlite3 (1.3.3)
33
- sqlite3-ruby (1.3.3)
34
- sqlite3 (>= 1.3.3)
35
- tzinfo (0.3.26)
41
+ sqlite3 (1.3.5)
42
+ tzinfo (0.3.32)
36
43
 
37
44
  PLATFORMS
38
45
  ruby
39
46
 
40
47
  DEPENDENCIES
41
- activerecord (>= 2.3.2)
48
+ appraisal (~> 0.4.0)
49
+ i18n
50
+ rake
51
+ rdoc (~> 3.12)
42
52
  rspec (~> 2.0)
43
- sqlite3-ruby (~> 1.3.1)
53
+ sqlite3 (~> 1.3.4)
44
54
  validates_lengths_from_database!
data/README.rdoc CHANGED
@@ -1,3 +1,5 @@
1
+ {<img src="https://secure.travis-ci.org/rubiety/validates_lengths_from_database.png?branch=master" alt="Build Status" />}[http://travis-ci.org/rubiety/validates_lengths_from_database]
2
+
1
3
  == Validates Lengths from Database
2
4
 
3
5
  Few people add length validations to fields in their database, and when saving such fields that have exhausted their length, an SQL error occurs.
@@ -27,4 +29,17 @@ It also supports filter-style :only and :except options:
27
29
  validates_lengths_from_database :except => [:other_field]
28
30
  end
29
31
 
30
- Note that this cannot be done at a global level directly against ActiveRecord::Base, since the +validates_length_from_database+ method requires the class to have a table name (with the ability to load the schema).
32
+ If you'd rather specify the limits explicitly instead of pulling them from the database, you can set it:
33
+
34
+ class Post < ActiveRecord::Base
35
+ validates_lengths_from_database :limit => 255
36
+ end
37
+
38
+ Or to set the limit differently for string (VARCHAR) and (TEXT) columns:
39
+
40
+ class Post < ActiveRecord::Base
41
+ validates_lengths_from_database :limit => {:string => 255, :text => 4092}
42
+ end
43
+
44
+ Note that unfortunately this cannot be done at a global level directly against ActiveRecord::Base, since the +validates_length_from_database+ method requires the class to have a table name (with the ability to load the schema).
45
+
data/Rakefile CHANGED
@@ -1,15 +1,31 @@
1
1
  require 'rubygems'
2
+ require 'bundler/setup'
3
+
2
4
  require 'rake'
3
- require 'rake/rdoctask'
4
-
5
- desc "Generate documentation for the plugin."
6
- Rake::RDocTask.new(:rdoc) do |rdoc|
7
- rdoc.rdoc_dir = "rdoc"
8
- rdoc.title = "validates_lengths_from_database"
9
- rdoc.options << "--line-numbers" << "--inline-source"
10
- rdoc.rdoc_files.include('README')
11
- rdoc.rdoc_files.include('lib/**/*.rb')
5
+ require 'rspec/core/rake_task'
6
+ require 'appraisal'
7
+
8
+ Bundler::GemHelper.install_tasks
9
+
10
+ desc 'Default: run unit tests.'
11
+ task :default => [:clean, :all]
12
+
13
+ desc "Run Specs against all Appraisals"
14
+ task :all => :spec do
15
+ Rake::Task["appraisal:install"].execute
16
+ system("bundle exec rake -s appraisal spec")
12
17
  end
13
18
 
14
- Dir["#{File.dirname(__FILE__)}/lib/tasks/*.rake"].sort.each { |ext| load ext }
19
+ desc "Run Specs"
20
+ RSpec::Core::RakeTask.new(:spec) do |t|
21
+ end
22
+
23
+ task :test => :spec
24
+
25
+ desc "Clean up files."
26
+ task :clean do |t|
27
+ FileUtils.rm_rf "tmp"
28
+ Dir.glob("spec/db/*.sqlite3").each {|f| FileUtils.rm f }
29
+ Dir.glob("validates_lengths_from_database-*.gem").each {|f| FileUtils.rm f }
30
+ end
15
31
 
@@ -12,9 +12,13 @@ module ValidatesLengthsFromDatabase
12
12
  options.symbolize_keys!
13
13
 
14
14
  return false unless self.table_exists?
15
+ options[:only] = Array[options[:only]] if options[:only] && !options[:only].is_a?(Array)
16
+ options[:except] = Array[options[:except]] if options[:except] && !options[:except].is_a?(Array)
17
+ options[:limit] ||= {}
15
18
 
16
- raise ArgumentError, "The :only option to validates_lengths_from_database must be an array." if options[:only] and !options[:only].is_a?(Array)
17
- raise ArgumentError, "The :except option to validates_lengths_from_database must be an array." if options[:except] and !options[:except].is_a?(Array)
19
+ if options[:limit] and !options[:limit].is_a?(Hash)
20
+ options[:limit] = {:string => options[:limit], :text => options[:limit]}
21
+ end
18
22
 
19
23
  if options[:only]
20
24
  columns_to_validate = options[:only].map(&:to_s)
@@ -27,10 +31,12 @@ module ValidatesLengthsFromDatabase
27
31
  column_schema = columns.find {|c| c.name == column }
28
32
  next if column_schema.nil?
29
33
  next if ![:string, :text].include?(column_schema.type)
30
- next if column_schema.limit.nil?
34
+
35
+ column_limit = options[:limit][column_schema.type] || column_schema.limit
36
+ next unless column_limit
31
37
 
32
38
  class_eval do
33
- validates_length_of column, :maximum => column_schema.limit, :allow_blank => true
39
+ validates_length_of column, :maximum => column_limit, :allow_blank => true
34
40
  end
35
41
  end
36
42
 
@@ -1,3 +1,3 @@
1
1
  module ValidatesLengthsFromDatabase
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
data/spec/db/schema.rb CHANGED
@@ -8,4 +8,12 @@ ActiveRecord::Schema.define(:version => 0) do
8
8
  t.integer :integer_1
9
9
  end
10
10
 
11
+ create_table :articles_high_limit, :force => true do |t|
12
+ t.string :string_1
13
+ t.string :string_2
14
+ t.text :text_1
15
+ t.date :date_1
16
+ t.integer :integer_1
17
+ end
18
+
11
19
  end
data/spec/db/test.sqlite3 CHANGED
Binary file
@@ -18,6 +18,10 @@ describe ValidatesLengthsFromDatabase do
18
18
  :integer_1 => 123
19
19
  }
20
20
 
21
+ before(:all) do
22
+ ActiveSupport::Deprecation.silenced = true
23
+ end
24
+
21
25
  context "Model without associated table" do
22
26
  specify "defining validates_lengths_from_database should not raise an error" do
23
27
  lambda {
@@ -60,6 +64,60 @@ describe ValidatesLengthsFromDatabase do
60
64
  end
61
65
  end
62
66
 
67
+ context "Model with validates_lengths_from_database :limit => 10" do
68
+ before do
69
+ class ArticleValidateLimit < ActiveRecord::Base
70
+ set_table_name "articles_high_limit"
71
+ validates_lengths_from_database :limit => 5
72
+ end
73
+ end
74
+
75
+ context "an article with overloaded attributes" do
76
+ before { @article = ArticleValidateLimit.new(LONG_ATTRIBUTES); @article.valid? }
77
+
78
+ it "should not be valid" do
79
+ @article.should_not be_valid
80
+ end
81
+
82
+ it "should have errors on all string/text attributes" do
83
+ @article.errors["string_1"].join.should =~ /too long/
84
+ @article.errors["string_2"].join.should =~ /too long/
85
+ @article.errors["text_1"].join.should =~ /too long/
86
+ end
87
+ end
88
+
89
+ context "an article with short attributes" do
90
+ before { @article = ArticleValidateLimit.new(SHORT_ATTRIBUTES); @article.valid? }
91
+
92
+ it "should be valid" do
93
+ @article.should be_valid
94
+ end
95
+ end
96
+ end
97
+
98
+ context "Model with validates_lengths_from_database :limit => {:string => 5, :text => 100}" do
99
+ before do
100
+ class ArticleValidateSpecificLimit < ActiveRecord::Base
101
+ set_table_name "articles_high_limit"
102
+ validates_lengths_from_database :limit => {:string => 5, :text => 100}
103
+ end
104
+ end
105
+
106
+ context "an article with overloaded attributes" do
107
+ before { @article = ArticleValidateSpecificLimit.new(LONG_ATTRIBUTES); @article.valid? }
108
+
109
+ it "should not be valid" do
110
+ @article.should_not be_valid
111
+ end
112
+
113
+ it "should have errors on all string/text attributes" do
114
+ @article.errors["string_1"].join.should =~ /too long/
115
+ @article.errors["string_2"].join.should =~ /too long/
116
+ @article.errors["text_1"].should_not be_present
117
+ end
118
+ end
119
+ end
120
+
63
121
  context "Model with validates_lengths_from_database :only => [:string_1, :text_1]" do
64
122
  before do
65
123
  class ArticleValidateOnly < ActiveRecord::Base
metadata CHANGED
@@ -1,79 +1,100 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: validates_lengths_from_database
3
- version: !ruby/object:Gem::Version
4
- hash: 29
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 1
9
- - 3
10
- version: 0.1.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Ben Hughes
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-04-15 00:00:00 -04:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2012-04-01 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: activerecord
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70330927789240 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 7
30
- segments:
31
- - 2
32
- - 3
33
- - 2
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
34
21
  version: 2.3.2
35
22
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
23
+ prerelease: false
24
+ version_requirements: *70330927789240
25
+ - !ruby/object:Gem::Dependency
38
26
  name: rspec
27
+ requirement: &70330927787800 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ type: :development
39
34
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
35
+ version_requirements: *70330927787800
36
+ - !ruby/object:Gem::Dependency
37
+ name: sqlite3
38
+ requirement: &70330927781040 !ruby/object:Gem::Requirement
41
39
  none: false
42
- requirements:
40
+ requirements:
43
41
  - - ~>
44
- - !ruby/object:Gem::Version
45
- hash: 3
46
- segments:
47
- - 2
48
- - 0
49
- version: "2.0"
42
+ - !ruby/object:Gem::Version
43
+ version: 1.3.4
50
44
  type: :development
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: sqlite3-ruby
54
45
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
46
+ version_requirements: *70330927781040
47
+ - !ruby/object:Gem::Dependency
48
+ name: appraisal
49
+ requirement: &70330927779540 !ruby/object:Gem::Requirement
56
50
  none: false
57
- requirements:
51
+ requirements:
58
52
  - - ~>
59
- - !ruby/object:Gem::Version
60
- hash: 25
61
- segments:
62
- - 1
63
- - 3
64
- - 1
65
- version: 1.3.1
53
+ - !ruby/object:Gem::Version
54
+ version: 0.4.0
66
55
  type: :development
67
- version_requirements: *id003
68
- description: Introspects your database string field maximum lengths and automatically defines length validations.
56
+ prerelease: false
57
+ version_requirements: *70330927779540
58
+ - !ruby/object:Gem::Dependency
59
+ name: rdoc
60
+ requirement: &70330927777720 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: '3.12'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70330927777720
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: &70330927776440 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70330927776440
80
+ - !ruby/object:Gem::Dependency
81
+ name: i18n
82
+ requirement: &70330927774820 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70330927774820
91
+ description: Introspects your database string field maximum lengths and automatically
92
+ defines length validations.
69
93
  email: ben@railsgarden.com
70
94
  executables: []
71
-
72
95
  extensions: []
73
-
74
96
  extra_rdoc_files: []
75
-
76
- files:
97
+ files:
77
98
  - lib/validates_lengths_from_database/railtie.rb
78
99
  - lib/validates_lengths_from_database/version.rb
79
100
  - lib/validates_lengths_from_database.rb
@@ -83,47 +104,35 @@ files:
83
104
  - spec/spec_helper.rb
84
105
  - spec/validates_lengths_from_database_spec.rb
85
106
  - rails/init.rb
107
+ - Appraisals
86
108
  - Gemfile
87
109
  - Gemfile.lock
88
110
  - LICENSE
89
111
  - Rakefile
90
112
  - README.rdoc
91
113
  - init.rb
92
- has_rdoc: true
93
114
  homepage: http://github.com/rubiety/validates_lengths_from_database
94
115
  licenses: []
95
-
96
116
  post_install_message:
97
117
  rdoc_options: []
98
-
99
- require_paths:
118
+ require_paths:
100
119
  - lib
101
- required_ruby_version: !ruby/object:Gem::Requirement
120
+ required_ruby_version: !ruby/object:Gem::Requirement
102
121
  none: false
103
- requirements:
104
- - - ">="
105
- - !ruby/object:Gem::Version
106
- hash: 3
107
- segments:
108
- - 0
109
- version: "0"
110
- required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
127
  none: false
112
- requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- hash: 19
116
- segments:
117
- - 1
118
- - 3
119
- - 4
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
120
131
  version: 1.3.4
121
132
  requirements: []
122
-
123
133
  rubyforge_project: validates_lengths_from_database
124
- rubygems_version: 1.3.7
134
+ rubygems_version: 1.8.10
125
135
  signing_key:
126
136
  specification_version: 3
127
137
  summary: Automatic maximum-length validations.
128
138
  test_files: []
129
-