validates_by_schema 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -3,22 +3,34 @@
3
3
 
4
4
  Automatic validation based on your database schema column types and limits. Keep your code DRY by inferring column validations from table properties!
5
5
 
6
- ## Usage
6
+ ## Install
7
7
 
8
8
  1. Add it to your Gemfile:
9
9
  ```ruby
10
- gem "validates_by_schema", :git => git://github.com/joshwlewis/validates_by_schema.git
10
+ gem "validates_by_schema"
11
11
  ```
12
12
 
13
13
  2. Then `bundle`
14
14
 
15
- 3. Add it to your ActiveRecord model:
15
+ 3. Call it from your ActiveRecord model:
16
16
  ```ruby
17
17
  class Widget < ActiveRecord::Base
18
- validates_from_schema
18
+ validates_by_schema
19
19
  end
20
20
  ```
21
21
 
22
+ ## Usage
23
+
24
+ You can also whitelist/blacklist columns with :only and :except options
25
+
26
+ ```ruby
27
+ validates_by_schema only: [:body, :description]
28
+ ```
29
+
30
+ ```ruby
31
+ validates_by_schema except: [:name, :title]
32
+ ```
33
+
22
34
  ## Example
23
35
 
24
36
  Say you had a table setup like this:
@@ -30,11 +42,11 @@ create_table "widgets", :force => true do |t|
30
42
  end
31
43
  ```
32
44
 
33
- Then these validations run when your model `validates_from_schema`:
45
+ Then these validations run when your model `validates_by_schema`:
34
46
  ```ruby
35
- validates :wheel_count, presence: true, numericality {allow_nil: false, less_than: 2147483647}
36
- validates :thickness, numericality: {allow_nil: true, less_than: 0.999, greater_than: -0.999}
47
+ validates :wheel_count, presence: true, numericality {allow_nil: false, greater_than: -2147483647, less_than: 2147483647}
48
+ validates :thickness, numericality: {allow_nil: true, less_than_or_equal_to: 0.999, greater_than_or_equal_to: -0.999}
37
49
  validates :color, length: {allow_nil: true, maximum: 255}
38
50
  ```
39
51
 
40
- This should support any database supported by Rails. I have only tested MySQL up to this point.
52
+ This is tested with postgres, mysql, and sqlite3. It will most likely work with any other database Rails supports.
@@ -1,10 +1,12 @@
1
1
  module ValidatesBySchema
2
+ autoload :ValidationOption, 'validates_by_schema/validation_option'
3
+
2
4
  extend ActiveSupport::Concern
3
5
 
4
6
  module ClassMethods
5
7
  def validates_by_schema options={}
6
8
  return unless table_exists?
7
- # Don't auto validated primary keys or timestamps
9
+ # Don't auto validate primary keys or timestamps
8
10
  columns = self.columns.reject(&:primary)
9
11
  columns.reject!{|c| ['updated_at', 'created_at'].include? c.name}
10
12
 
@@ -18,36 +20,13 @@ module ValidatesBySchema
18
20
  end
19
21
 
20
22
  columns.each do |c|
21
- case c.type
22
- when :integer
23
- val_hash = {presence: !c.null, numericality: {
24
- only_integer: true, allow_nil: c.null}}
25
- if c.limit
26
- max = (2 ** (8 * c.limit)) / 2
27
- val_hash[:numericality][:less_than] = max
28
- val_hash[:numericality][:greater_than] = -max
29
- end
30
- validates c.name, val_hash
31
- when :decimal
32
- maximum = 10.0**(c.precision-c.scale) - 10.0**(-c.scale)
33
- validates c.name, presence: !c.null, numericality: {
34
- allow_nil: c.null, greater_than_or_equal_to: -maximum,
35
- less_than_or_equal_to: maximum }
36
- when :float
37
- validates c.name, presence: !c.null,
38
- numericality: { allow_nil: c.null }
39
- when :string, :text
40
- validates c.name, presence: !c.null, length: { maximum: c.limit.to_i,
41
- allow_nil: c.null}
42
- when :boolean
43
- validates c.name, inclusion: { in: [true, false],
44
- allow_nil: c.null }
45
- when :date, :datetime, :time
46
- validates c.name, presence: !c.null
47
- end
23
+ vo = ValidationOption.new(c).to_hash
24
+ validates c.name, vo if vo.present?
48
25
  end
49
26
  end
50
27
  end
51
28
  end
52
29
 
53
- ActiveRecord::Base.send(:include, ValidatesBySchema)
30
+ ActiveSupport.on_load :active_record do
31
+ include ValidatesBySchema
32
+ end
@@ -0,0 +1,76 @@
1
+ class ValidatesBySchema::ValidationOption
2
+ # column here must be an ActiveRecord column
3
+ # i.e. MyARModel.columns.first
4
+ attr_accessor :column
5
+
6
+ def initialize(column)
7
+ @column = column
8
+ end
9
+
10
+ def presence?
11
+ presence && column.type != :boolean
12
+ end
13
+
14
+ def presence
15
+ !column.null
16
+ end
17
+
18
+ def numericality?
19
+ [:integer, :decimal, :float].include? column.type
20
+ end
21
+
22
+ def numericality
23
+ numericality = {}
24
+ if column.type == :integer
25
+ numericality[:only_integer] = true
26
+ if integer_max
27
+ numericality[:less_than] = integer_max
28
+ numericality[:greater_than] = -integer_max
29
+ end
30
+ elsif column.type == :decimal
31
+ numericality[:less_than_or_equal_to] = decimal_max
32
+ numericality[:greater_than_or_equal_to] = -decimal_max
33
+ end
34
+ numericality[:allow_nil] = column.null
35
+ numericality
36
+ end
37
+
38
+ def length?
39
+ [:string, :text].include?(column.type) && column.limit
40
+ end
41
+
42
+ def length
43
+ {:maximum => column.limit, :allow_nil => column.null }
44
+ end
45
+
46
+ def inclusion?
47
+ column.type == :boolean
48
+ end
49
+
50
+ def inclusion
51
+ {:in => [true, false], :allow_nil => column.null}
52
+ end
53
+
54
+ def integer_max
55
+ (2 ** (8 * column.limit)) / 2 if column.limit
56
+ end
57
+
58
+ def decimal_max
59
+ 10.0**(column.precision-column.scale) - 10.0**(-column.scale)
60
+ end
61
+
62
+ def string_max
63
+ column.limit
64
+ end
65
+
66
+ def to_hash
67
+ [:presence, :numericality, :length, :inclusion].inject({}) do |h,k|
68
+ send(:"#{k}?") ? h.merge(k => send(k)) : h
69
+ end
70
+ end
71
+
72
+ def to_s
73
+ to_hash.inspect
74
+ end
75
+
76
+ end
@@ -1,3 +1,3 @@
1
1
  module ValidatesBySchema
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_by_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-10 00:00:00.000000000 Z
12
+ date: 2012-12-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -75,6 +75,38 @@ dependencies:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: pg
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: mysql2
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
78
110
  description: Keep your code DRY by inferring column validations from table properties!
79
111
  Automagically validate presence, length, numericality, and inclusion of ActiveRecord
80
112
  backed columns.
@@ -85,6 +117,7 @@ extensions: []
85
117
  extra_rdoc_files: []
86
118
  files:
87
119
  - lib/tasks/validates_by_schema_tasks.rake
120
+ - lib/validates_by_schema/validation_option.rb
88
121
  - lib/validates_by_schema/version.rb
89
122
  - lib/validates_by_schema.rb
90
123
  - MIT-LICENSE