activerecord_mysql_strict 0.1.1 → 0.2
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/lib/active_record/mysql/strict/validations.rb +40 -0
- data/lib/active_record/mysql/strict/version.rb +1 -1
- data/lib/activerecord_mysql_strict.rb +2 -3
- data/spec/activerecord_mysql_strict/{mixin_spec.rb → validations_spec.rb} +31 -3
- data/spec/activerecord_mysql_strict_spec.rb +28 -0
- data/spec/support/macros/model_macros.rb +2 -2
- metadata +8 -6
- data/lib/active_record/mysql/strict/mixin.rb +0 -46
@@ -0,0 +1,40 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module MySQL
|
3
|
+
module Strict
|
4
|
+
module Validations
|
5
|
+
# Constants
|
6
|
+
MYSQL_STRICT_STRING_LIMIT = 255
|
7
|
+
MYSQL_STRICT_TEXT_LIMIT = 65535
|
8
|
+
MYSQL_STRICT_INTEGER_LIMIT = 2147483647
|
9
|
+
|
10
|
+
def self.define_mysql_strict_validations(klass, options = {})
|
11
|
+
except = options[:except] || []
|
12
|
+
model_columns = klass.columns.dup.reject { |c| except.include?(c.name.to_sym) }
|
13
|
+
|
14
|
+
if only = options[:only]
|
15
|
+
model_columns = model_columns.select { |c| only.include?(c.name.to_sym) }
|
16
|
+
end
|
17
|
+
|
18
|
+
model_columns.each do |field|
|
19
|
+
method = :"define_mysql_strict_#{field.type}_validation"
|
20
|
+
Validations.send(method, klass, field) if Validations.respond_to?(method)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def self.define_mysql_strict_string_validation(klass, field)
|
27
|
+
klass.validates field.name, 'ActiveRecord::MySQL::Strict::StrictLength' => { in: 0..(field.limit || MYSQL_STRICT_STRING_LIMIT) }, allow_blank: true
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.define_mysql_strict_text_validation(klass, field)
|
31
|
+
klass.validates field.name, 'ActiveRecord::MySQL::Strict::StrictLength' => { in: 0..(field.limit || MYSQL_STRICT_TEXT_LIMIT) }, allow_blank: true
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.define_mysql_strict_integer_validation(klass, field)
|
35
|
+
klass.validates field.name, numericality: { greather_than_or_equal_to: -MYSQL_STRICT_INTEGER_LIMIT, less_than_or_equal_to: MYSQL_STRICT_INTEGER_LIMIT }, allow_blank: true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -5,11 +5,10 @@ require 'active_model'
|
|
5
5
|
require 'active_support'
|
6
6
|
|
7
7
|
require 'active_record/mysql/strict/strict_length_validator'
|
8
|
-
require 'active_record/mysql/strict/
|
8
|
+
require 'active_record/mysql/strict/validations'
|
9
9
|
|
10
10
|
class ActiveRecord::Base
|
11
11
|
def self.validates_strict_columns(options = {})
|
12
|
-
|
13
|
-
include ActiveRecord::MySQL::Strict::Mixin
|
12
|
+
ActiveRecord::MySQL::Strict::Validations.define_mysql_strict_validations(self, options)
|
14
13
|
end
|
15
14
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe ActiveRecord::MySQL::Strict::
|
4
|
-
describe :
|
3
|
+
describe ActiveRecord::MySQL::Strict::Validations do
|
4
|
+
describe :define_mysql_strict_validations do
|
5
5
|
context 'for model without other validations' do
|
6
6
|
let(:model) { strict_model 'User' }
|
7
7
|
|
@@ -129,7 +129,7 @@ describe ActiveRecord::MySQL::Strict::Mixin do
|
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
|
-
context 'for model with accessor that returns an invalid string' do
|
132
|
+
context 'for valid model with accessor that returns an invalid string' do
|
133
133
|
let(:model) do
|
134
134
|
strict_model 'User' do
|
135
135
|
attr_reader :long_name
|
@@ -152,7 +152,35 @@ describe ActiveRecord::MySQL::Strict::Mixin do
|
|
152
152
|
end
|
153
153
|
|
154
154
|
subject { model.new(long_name: '*' * 10) }
|
155
|
+
its(:long_name) { should eql '*' * 400 }
|
155
156
|
it { should be_valid }
|
156
157
|
end
|
158
|
+
|
159
|
+
context 'for invalid model with accessor that returns a valid string' do
|
160
|
+
let(:model) do
|
161
|
+
strict_model 'User' do
|
162
|
+
attr_reader :short_name
|
163
|
+
|
164
|
+
# When we call `#short_name` it will return a valid string but
|
165
|
+
# we want the attribute to store the real, valid value because we
|
166
|
+
# want to actually make sure that the real attribute value does
|
167
|
+
# exceed the limit, not what the accessor returns.
|
168
|
+
define_method :short_name= do |value|
|
169
|
+
@short_name = '*' * 100
|
170
|
+
write_attribute(:short_name, value)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
before do
|
176
|
+
run_migration do
|
177
|
+
create_table(:users, force: true) { |t| t.string :short_name }
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
subject { model.new(short_name: '*' * 400) }
|
182
|
+
its(:short_name) { should eql '*' * 100 }
|
183
|
+
it { should_not be_valid }
|
184
|
+
end
|
157
185
|
end
|
158
186
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveRecord::MySQL::Strict do
|
4
|
+
describe :validates_strict_columns do
|
5
|
+
before do
|
6
|
+
spawn_model 'User'
|
7
|
+
run_migration do
|
8
|
+
create_table(:users, force: true) { |t| t.string :name }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'without options' do
|
13
|
+
before do
|
14
|
+
expect(ActiveRecord::MySQL::Strict::Validations).to receive(:define_mysql_strict_validations).with(User, {})
|
15
|
+
end
|
16
|
+
|
17
|
+
it { User.validates_strict_columns }
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with options' do
|
21
|
+
before do
|
22
|
+
expect(ActiveRecord::MySQL::Strict::Validations).to receive(:define_mysql_strict_validations).with(User, { except: [:bar], only: [:foo] })
|
23
|
+
end
|
24
|
+
|
25
|
+
it { User.validates_strict_columns except: [:bar], only: [:foo] }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ModelMacros
|
2
2
|
# Create a new microscope model
|
3
3
|
def strict_model(klass_name, options = {}, &block)
|
4
|
-
spawn_model klass_name
|
4
|
+
spawn_model klass_name do
|
5
5
|
validates_strict_columns options
|
6
6
|
instance_exec(&block) if block
|
7
7
|
end
|
@@ -10,7 +10,7 @@ module ModelMacros
|
|
10
10
|
protected
|
11
11
|
|
12
12
|
# Create a new model class
|
13
|
-
def spawn_model(klass_name, parent_klass, &block)
|
13
|
+
def spawn_model(klass_name, parent_klass = ActiveRecord::Base, &block)
|
14
14
|
Object.instance_eval { remove_const klass_name } if Object.const_defined?(klass_name)
|
15
15
|
Object.const_set(klass_name, Class.new(parent_klass))
|
16
16
|
Object.const_get(klass_name).class_eval(&block) if block_given?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord_mysql_strict
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -140,11 +140,12 @@ files:
|
|
140
140
|
- activerecord_mysql_strict.gemspec
|
141
141
|
- gemfiles/Gemfile.activerecord-3.2.x
|
142
142
|
- gemfiles/Gemfile.activerecord-4.0
|
143
|
-
- lib/active_record/mysql/strict/mixin.rb
|
144
143
|
- lib/active_record/mysql/strict/strict_length_validator.rb
|
144
|
+
- lib/active_record/mysql/strict/validations.rb
|
145
145
|
- lib/active_record/mysql/strict/version.rb
|
146
146
|
- lib/activerecord_mysql_strict.rb
|
147
|
-
- spec/activerecord_mysql_strict/
|
147
|
+
- spec/activerecord_mysql_strict/validations_spec.rb
|
148
|
+
- spec/activerecord_mysql_strict_spec.rb
|
148
149
|
- spec/spec_helper.rb
|
149
150
|
- spec/support/macros/database_macros.rb
|
150
151
|
- spec/support/macros/model_macros.rb
|
@@ -163,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
163
164
|
version: '0'
|
164
165
|
segments:
|
165
166
|
- 0
|
166
|
-
hash: -
|
167
|
+
hash: -2194545616864898002
|
167
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
169
|
none: false
|
169
170
|
requirements:
|
@@ -172,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
173
|
version: '0'
|
173
174
|
segments:
|
174
175
|
- 0
|
175
|
-
hash: -
|
176
|
+
hash: -2194545616864898002
|
176
177
|
requirements: []
|
177
178
|
rubyforge_project:
|
178
179
|
rubygems_version: 1.8.23
|
@@ -181,7 +182,8 @@ specification_version: 3
|
|
181
182
|
summary: ActiveRecord::MySQL::Strict adds validations to ActiveRecord models to make
|
182
183
|
sure they do not trigger errors in MySQL strict mode.
|
183
184
|
test_files:
|
184
|
-
- spec/activerecord_mysql_strict/
|
185
|
+
- spec/activerecord_mysql_strict/validations_spec.rb
|
186
|
+
- spec/activerecord_mysql_strict_spec.rb
|
185
187
|
- spec/spec_helper.rb
|
186
188
|
- spec/support/macros/database_macros.rb
|
187
189
|
- spec/support/macros/model_macros.rb
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module MySQL
|
3
|
-
module Strict
|
4
|
-
# Constants
|
5
|
-
MYSQL_STRICT_STRING_LIMIT = 255
|
6
|
-
MYSQL_STRICT_TEXT_LIMIT = 65535
|
7
|
-
MYSQL_STRICT_INTEGER_LIMIT = 2147483647
|
8
|
-
|
9
|
-
module Mixin
|
10
|
-
extend ActiveSupport::Concern
|
11
|
-
|
12
|
-
included do
|
13
|
-
define_mysql_strict_validations
|
14
|
-
end
|
15
|
-
|
16
|
-
module ClassMethods
|
17
|
-
def define_mysql_strict_validations
|
18
|
-
except = @mysql_strict_options[:except] || []
|
19
|
-
model_columns = self.columns.dup.reject { |c| except.include?(c.name.to_sym) }
|
20
|
-
|
21
|
-
if only = @mysql_strict_options[:only]
|
22
|
-
model_columns = model_columns.select { |c| only.include?(c.name.to_sym) }
|
23
|
-
end
|
24
|
-
|
25
|
-
model_columns.each do |field|
|
26
|
-
method = :"define_mysql_strict_#{field.type}_validation"
|
27
|
-
send(method, field) if respond_to?(method)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def define_mysql_strict_string_validation(field)
|
32
|
-
validates field.name, 'ActiveRecord::MySQL::Strict::StrictLength' => { in: 0..(field.limit || MYSQL_STRICT_STRING_LIMIT) }, allow_blank: true
|
33
|
-
end
|
34
|
-
|
35
|
-
def define_mysql_strict_text_validation(field)
|
36
|
-
validates field.name, 'ActiveRecord::MySQL::Strict::StrictLength' => { in: 0..(field.limit || MYSQL_STRICT_TEXT_LIMIT) }, allow_blank: true
|
37
|
-
end
|
38
|
-
|
39
|
-
def define_mysql_strict_integer_validation(field)
|
40
|
-
validates field.name, numericality: { greather_than_or_equal_to: -MYSQL_STRICT_INTEGER_LIMIT, less_than_or_equal_to: MYSQL_STRICT_INTEGER_LIMIT }, allow_blank: true
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|