mv-core 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.txt +20 -0
- data/README.rdoc +88 -0
- data/lib/migration_validators/active_record/base.rb +24 -0
- data/lib/migration_validators/active_record/connection_adapters/abstract_adapter.rb +36 -0
- data/lib/migration_validators/active_record/connection_adapters/native_adapter.rb +118 -0
- data/lib/migration_validators/active_record/connection_adapters/table.rb +15 -0
- data/lib/migration_validators/active_record/connection_adapters/table_definition.rb +24 -0
- data/lib/migration_validators/active_record/migration.rb +29 -0
- data/lib/migration_validators/active_record/schema.rb +31 -0
- data/lib/migration_validators/active_record/schema_dumper.rb +24 -0
- data/lib/migration_validators/adapters/base.rb +15 -0
- data/lib/migration_validators/adapters/containers.rb +102 -0
- data/lib/migration_validators/adapters/routing.rb +104 -0
- data/lib/migration_validators/adapters/syntax.rb +53 -0
- data/lib/migration_validators/adapters/validator_definitions.rb +131 -0
- data/lib/migration_validators/core/adapter_wrapper.rb +88 -0
- data/lib/migration_validators/core/db_validator.rb +178 -0
- data/lib/migration_validators/core/statement_builder.rb +60 -0
- data/lib/migration_validators/core/validator_container.rb +110 -0
- data/lib/migration_validators/core/validator_definition.rb +91 -0
- data/lib/migration_validators/core/validator_router.rb +45 -0
- data/lib/mv-core.rb +100 -0
- data/lib/options.rb +7 -0
- data/spec/migration_validators/active_record/connection_adapters/abstract_adapter_spec.rb +440 -0
- data/spec/migration_validators/active_record/connection_adapters/table_definition_spec.rb +4 -0
- data/spec/migration_validators/active_record/migration.rb +82 -0
- data/spec/migration_validators/active_record/schema_dumper_spec.rb +44 -0
- data/spec/migration_validators/adapters/base_spec.rb +89 -0
- data/spec/migration_validators/core/adapter_wrapper_spec.rb +168 -0
- data/spec/migration_validators/core/db_validator_spec.rb +347 -0
- data/spec/migration_validators/core/statement_builder_spec.rb +36 -0
- data/spec/migration_validators/core/validator_container_spec.rb +121 -0
- data/spec/migration_validators/core/validator_definition_spec.rb +131 -0
- data/spec/migration_validators/core/validator_router_spec.rb +60 -0
- data/spec/mv-core_spec.rb +4 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/factories/db_validator.rb +43 -0
- metadata +152 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
module MigrationValidators
|
2
|
+
module Core
|
3
|
+
class StatementBuilder
|
4
|
+
attr_reader :actions
|
5
|
+
|
6
|
+
def initialize value = "", builder = nil
|
7
|
+
@stmt = value
|
8
|
+
@actions = builder ? builder.actions.clone : {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
@stmt
|
13
|
+
end
|
14
|
+
|
15
|
+
def operation name, &block
|
16
|
+
@actions[name.to_s] = block || lambda{|stmt| stmt}
|
17
|
+
end
|
18
|
+
|
19
|
+
def compile value
|
20
|
+
StatementBuilder.new value, self
|
21
|
+
end
|
22
|
+
|
23
|
+
def merge! builder
|
24
|
+
@actions.merge!(builder.actions) if builder
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :old_method_missing, :method_missing
|
28
|
+
def method_missing method_name, *args
|
29
|
+
call_action(method_name, *args) || old_method_missing(method_name, *args)
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
|
35
|
+
attr_accessor :stmt
|
36
|
+
|
37
|
+
def clear!
|
38
|
+
@stmt = ""
|
39
|
+
end
|
40
|
+
|
41
|
+
def change *args, &block
|
42
|
+
@stmt = instance_exec(*args, &block).to_s
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def call_action action_name, *args
|
48
|
+
block = @actions[action_name.to_s]
|
49
|
+
|
50
|
+
if (block)
|
51
|
+
change(@stmt, *args, &block)
|
52
|
+
return self
|
53
|
+
end
|
54
|
+
|
55
|
+
return nil
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module MigrationValidators
|
2
|
+
module Core
|
3
|
+
class ValidatorContainer < StatementBuilder
|
4
|
+
attr_reader :name
|
5
|
+
|
6
|
+
def initialize name, definitions, builder = nil
|
7
|
+
super "", builder
|
8
|
+
|
9
|
+
@name = name
|
10
|
+
@definitions = definitions
|
11
|
+
|
12
|
+
group do |validator|
|
13
|
+
validator.name
|
14
|
+
end
|
15
|
+
|
16
|
+
constraint_name do |group_key|
|
17
|
+
group_key.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
operation :create do |stmt, group_name|
|
21
|
+
stmt
|
22
|
+
end
|
23
|
+
|
24
|
+
operation :drop do
|
25
|
+
""
|
26
|
+
end
|
27
|
+
|
28
|
+
operation :join do |stmt, stmt_1|
|
29
|
+
[stmt, stmt_1].delete_if(&:blank?).join(" JOIN ")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def group &block
|
34
|
+
@group_proc = block
|
35
|
+
end
|
36
|
+
|
37
|
+
def constraint_name &block
|
38
|
+
@constraint_name_proc = block
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_validators validators
|
42
|
+
res, constraint_name = process_validators(validators) do |existing_validators|
|
43
|
+
validators + existing_validators
|
44
|
+
end
|
45
|
+
|
46
|
+
validators.each {|validator| validator.save_to_constraint(constraint_name) }
|
47
|
+
|
48
|
+
res
|
49
|
+
end
|
50
|
+
|
51
|
+
def remove_validators validators
|
52
|
+
res, constraint_name = process_validators(validators) do |existing_validators|
|
53
|
+
existing_validators - validators
|
54
|
+
end
|
55
|
+
|
56
|
+
validators.each {|validator| validator.remove_from_constraint(constraint_name) }
|
57
|
+
|
58
|
+
res
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def process_validators validators
|
64
|
+
validators.group_by(&@group_proc).inject([]) do |res, (group_name, group)|
|
65
|
+
constraint_name = @constraint_name_proc.call(group_name)
|
66
|
+
constraint_validators = MigrationValidators::Core::DbValidator.constraint_validators(constraint_name)
|
67
|
+
|
68
|
+
group = yield(constraint_validators).uniq
|
69
|
+
|
70
|
+
stmt = drop_group(constraint_name, group_name)
|
71
|
+
res << stmt unless stmt.blank?
|
72
|
+
|
73
|
+
unless group.blank?
|
74
|
+
stmt = create_group(constraint_name, group_name, group)
|
75
|
+
res << stmt unless stmt.blank?
|
76
|
+
end
|
77
|
+
[res, constraint_name]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def isolate
|
82
|
+
clear!
|
83
|
+
yield if block_given?
|
84
|
+
res = self.to_s
|
85
|
+
clear!
|
86
|
+
res
|
87
|
+
end
|
88
|
+
|
89
|
+
def drop_group constraint_name, group_name
|
90
|
+
isolate { drop(constraint_name, group_name) }
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_group constraint_name, group_name, group
|
94
|
+
isolate do
|
95
|
+
group.each do |validator|
|
96
|
+
definition = @definitions[validator.validator_name.to_s] || @definitions[validator.validator_name.to_sym]
|
97
|
+
|
98
|
+
raise MigrationValidators::MigrationValidatorsException.new("Validator defintion for #{validator.validator_name} is not defined.") unless definition
|
99
|
+
|
100
|
+
definition.clone(self).process(validator).each do |statement|
|
101
|
+
join(statement)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
create(constraint_name, group_name) unless group.blank?
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module MigrationValidators
|
2
|
+
module Core
|
3
|
+
class ValidatorDefinition < StatementBuilder
|
4
|
+
attr_reader :validator
|
5
|
+
|
6
|
+
def initialize definition = nil, validator = nil, properties = {}, posts = []
|
7
|
+
super "", definition
|
8
|
+
|
9
|
+
@properties = properties
|
10
|
+
@posts = posts
|
11
|
+
|
12
|
+
self.validator = validator if validator
|
13
|
+
|
14
|
+
operation :bind_to_error do |stmt, error|
|
15
|
+
stmt
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def validator= validator
|
20
|
+
@validator = validator
|
21
|
+
@stmt = validator.column_name
|
22
|
+
end
|
23
|
+
|
24
|
+
def column
|
25
|
+
clone
|
26
|
+
end
|
27
|
+
|
28
|
+
def clone builder = nil
|
29
|
+
res = ValidatorDefinition.new self, validator, @properties.clone, @posts.clone
|
30
|
+
res.merge!(builder) if builder
|
31
|
+
res
|
32
|
+
end
|
33
|
+
|
34
|
+
def property name = "", opts = {}, &block
|
35
|
+
@properties[name.to_s] ||= [opts, block]
|
36
|
+
end
|
37
|
+
|
38
|
+
def post opts = {}, &block
|
39
|
+
@posts << [opts, block]
|
40
|
+
end
|
41
|
+
|
42
|
+
def process validator, filter = []
|
43
|
+
self.validator = validator
|
44
|
+
|
45
|
+
return [] if validator.options.nil?
|
46
|
+
|
47
|
+
unless filter.blank?
|
48
|
+
filter = filter.collect(&:to_s)
|
49
|
+
options = validator.options.select{|name, value| filter.include?(name.to_s) }
|
50
|
+
else
|
51
|
+
options = validator.options
|
52
|
+
end
|
53
|
+
|
54
|
+
res = options.inject([]) do |res, (property_name, property_value)|
|
55
|
+
res << self.to_s if handle_property(property_name, property_value)
|
56
|
+
res
|
57
|
+
end
|
58
|
+
|
59
|
+
return res unless res.blank?
|
60
|
+
return (handle_property("", options) && res << self.to_s) || []
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def handle_property property_name, property_value
|
66
|
+
opts, block = @properties[property_name.to_s]
|
67
|
+
|
68
|
+
if (block)
|
69
|
+
at_least_one_property_handled = true
|
70
|
+
change(property_value, &block)
|
71
|
+
apply_posts
|
72
|
+
bind_to_error(message(opts))
|
73
|
+
|
74
|
+
return true
|
75
|
+
end
|
76
|
+
|
77
|
+
false
|
78
|
+
end
|
79
|
+
|
80
|
+
def apply_posts
|
81
|
+
@posts.each{|opts, post_block| change(&post_block) if validator.satisfies(opts)}
|
82
|
+
end
|
83
|
+
|
84
|
+
def message opts
|
85
|
+
validator.options[opts[:message]] ||
|
86
|
+
validator.options[:message] ||
|
87
|
+
validator.error_message
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module MigrationValidators
|
2
|
+
module Core
|
3
|
+
class ValidatorRouter
|
4
|
+
def initialize containers
|
5
|
+
@containers = containers
|
6
|
+
@routes = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def to container_name, conditions = {}
|
10
|
+
raise "Container name is undefined" if container_name.blank?
|
11
|
+
|
12
|
+
@routes[container_name] ||= conditions[:if]
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_validators validators
|
16
|
+
process(validators) do |container, filtered_validators|
|
17
|
+
container.add_validators(filtered_validators)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def remove_validators validators
|
22
|
+
process(validators) do |container, filtered_validators|
|
23
|
+
container.remove_validators(filtered_validators)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def process validators
|
30
|
+
@routes.inject([]) do |res, (container_name, conditions)|
|
31
|
+
filtered_validators = validators.select {|validator| validator.satisfies(conditions)}
|
32
|
+
|
33
|
+
unless filtered_validators.blank?
|
34
|
+
container = @containers[container_name]
|
35
|
+
raise MigrationValidators::MigrationValidatorsException.new("Routing error. Contianer #{container_name} is not defined.") if container.nil?
|
36
|
+
|
37
|
+
res.concat(yield(container, filtered_validators))
|
38
|
+
end
|
39
|
+
|
40
|
+
res
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/mv-core.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
require File.expand_path(File.dirname(__FILE__)) + '/options'
|
5
|
+
|
6
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/active_record/connection_adapters/table'
|
7
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/active_record/connection_adapters/abstract_adapter'
|
8
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/active_record/connection_adapters/native_adapter'
|
9
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/active_record/connection_adapters/table_definition'
|
10
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/active_record/base'
|
11
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/active_record/migration'
|
12
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/active_record/schema'
|
13
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/active_record/schema_dumper'
|
14
|
+
|
15
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/core/db_validator'
|
16
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/core/adapter_wrapper'
|
17
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/core/statement_builder'
|
18
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/core/validator_definition'
|
19
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/core/validator_container'
|
20
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/core/validator_router'
|
21
|
+
|
22
|
+
require File.expand_path(File.dirname(__FILE__)) + '/migration_validators/adapters/base'
|
23
|
+
|
24
|
+
module MigrationValidators
|
25
|
+
class MigrationValidatorsException < Exception; end
|
26
|
+
class << self
|
27
|
+
def validators
|
28
|
+
@validators ||= {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def dumpers
|
32
|
+
@dumpers ||= {}
|
33
|
+
end
|
34
|
+
|
35
|
+
def register_adapter! name, klass
|
36
|
+
validators[name] = klass
|
37
|
+
reload_validator
|
38
|
+
end
|
39
|
+
|
40
|
+
def register_dumper! name, klass
|
41
|
+
dumpers[name] = klass
|
42
|
+
end
|
43
|
+
|
44
|
+
def current_connection_adapter
|
45
|
+
::ActiveRecord::Base.connection_pool.spec.config[:adapter]
|
46
|
+
end
|
47
|
+
|
48
|
+
def dumper
|
49
|
+
@dumper || dumpers[current_adapter].new
|
50
|
+
end
|
51
|
+
|
52
|
+
def adapter= adapter
|
53
|
+
@adapter = adapter
|
54
|
+
@validator = nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def adapter
|
58
|
+
@adapter
|
59
|
+
end
|
60
|
+
|
61
|
+
def validator
|
62
|
+
return nil unless @adapter || validators[current_connection_adapter]
|
63
|
+
|
64
|
+
@validator ||= MigrationValidators::Core::AdapterWrapper.new(@adapter || validators[current_connection_adapter].new)
|
65
|
+
end
|
66
|
+
|
67
|
+
def reload_validator
|
68
|
+
@adapter = nil
|
69
|
+
@validator = nil
|
70
|
+
end
|
71
|
+
|
72
|
+
def load!
|
73
|
+
::ActiveRecord::ConnectionAdapters::TableDefinition.class_eval { include MigrationValidators::ActiveRecord::ConnectionAdapters::TableDefinition }
|
74
|
+
::ActiveRecord::ConnectionAdapters::Table.class_eval { include MigrationValidators::ActiveRecord::ConnectionAdapters::Table }
|
75
|
+
::ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval { include MigrationValidators::ActiveRecord::ConnectionAdapters::AbstractAdapter }
|
76
|
+
::ActiveRecord::Base.instance_eval { include MigrationValidators::ActiveRecord::Base }
|
77
|
+
::ActiveRecord::Migration.instance_eval { include MigrationValidators::ActiveRecord::Migration }
|
78
|
+
::ActiveRecord::Schema.instance_eval { include MigrationValidators::ActiveRecord::Schema }
|
79
|
+
::ActiveRecord::SchemaDumper.instance_eval { include MigrationValidators::ActiveRecord::SchemaDumper }
|
80
|
+
|
81
|
+
::ActiveRecord::SchemaDumper.ignore_tables << MigrationValidators.migration_validators_table_name.to_s
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
Dir.glob('adapters/**/*.rb').each {|file_name| require file_name}
|
87
|
+
|
88
|
+
if defined?(Rails::Railtie)
|
89
|
+
module Foreigner
|
90
|
+
class Railtie < Rails::Railtie
|
91
|
+
initializer 'migration-validators.load' do
|
92
|
+
ActiveSupport.on_load :active_record do
|
93
|
+
MigrationValidators.load!
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
else
|
99
|
+
MigrationValidators.load!
|
100
|
+
end
|
data/lib/options.rb
ADDED
@@ -0,0 +1,440 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
+
|
3
|
+
AbstractAdapter = ::ActiveRecord::ConnectionAdapters::AbstractAdapter
|
4
|
+
|
5
|
+
describe ::ActiveRecord::ConnectionAdapters::AbstractAdapter, "migration validators extension", :type => :mv_test do
|
6
|
+
|
7
|
+
before :all do
|
8
|
+
use_memory_db
|
9
|
+
@migrations_table = ::ActiveRecord::Migrator::schema_migrations_table_name
|
10
|
+
@validators_table = MigrationValidators.migration_validators_table_name
|
11
|
+
end
|
12
|
+
|
13
|
+
before :each do
|
14
|
+
MigrationValidators::Core::DbValidator.rollback
|
15
|
+
end
|
16
|
+
|
17
|
+
describe :initialize_migration_validators_table do
|
18
|
+
before :each do
|
19
|
+
db.drop_table @validators_table if db.table_exists?(@validators_table)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "creates table if it's not created" do
|
23
|
+
db.initialize_migration_validators_table
|
24
|
+
db.table_exists?(@validators_table).should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should not throw an error if table already exists" do
|
28
|
+
db.initialize_migration_validators_table
|
29
|
+
|
30
|
+
lambda { db.initialize_migration_validators_table }.should_not raise_error
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe :initialize_schema_migrations_table do
|
35
|
+
before :each do
|
36
|
+
|
37
|
+
db.do_internally do
|
38
|
+
db.drop_table @migrations_table if db.table_exists?(@migrations_table)
|
39
|
+
db.drop_table @validators_table if db.table_exists?(@validators_table)
|
40
|
+
end
|
41
|
+
db.initialize_schema_migrations_table
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should initialize migrations table as usuall" do
|
45
|
+
db.table_exists?(@migrations_table).should be_true
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should also initialize validators table" do
|
49
|
+
db.table_exists?(@validators_table).should be_true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "synchronization with schema statements" do
|
54
|
+
before :each do
|
55
|
+
|
56
|
+
db.do_internally do
|
57
|
+
db.drop_table :new_table_name if db.table_exists?(:new_table_name)
|
58
|
+
db.drop_table :table_name if db.table_exists?(:table_name)
|
59
|
+
db.create_table(:table_name) do |t|
|
60
|
+
t.string :column_name
|
61
|
+
t.string :column_name1
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
MigrationValidators::Core::DbValidator.delete_all
|
66
|
+
end
|
67
|
+
|
68
|
+
describe :drop_table do
|
69
|
+
it "drops all validators of the dropped table" do
|
70
|
+
db.validate_column :table_name, :column_name, :uniqueness => {:message => "some message"}
|
71
|
+
MigrationValidators::Core::DbValidator.commit
|
72
|
+
|
73
|
+
db.drop_table :table_name
|
74
|
+
MigrationValidators::Core::DbValidator.commit
|
75
|
+
|
76
|
+
MigrationValidators::Core::DbValidator.count.should be_zero
|
77
|
+
end
|
78
|
+
|
79
|
+
it "still drops table" do
|
80
|
+
db.drop_table :table_name
|
81
|
+
db.table_exists?(:table_name).should be_false
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe :remove_column do
|
86
|
+
it "removes column validators" do
|
87
|
+
db.validate_column :table_name, :column_name, :uniqueness => {:message => "some message"}
|
88
|
+
db.validate_column :table_name, :column_name1, :uniqueness => {:message => "some message"}
|
89
|
+
MigrationValidators::Core::DbValidator.commit
|
90
|
+
|
91
|
+
db.remove_column :table_name, :column_name1
|
92
|
+
MigrationValidators::Core::DbValidator.commit
|
93
|
+
|
94
|
+
MigrationValidators::Core::DbValidator.count.should == 1
|
95
|
+
MigrationValidators::Core::DbValidator.first.column_name.should == "column_name"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "still removes column" do
|
99
|
+
db.remove_column :table_name, :column_name1
|
100
|
+
db.column_exists?(:table_name, :column_name1).should be_false
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
describe :rename_column do
|
106
|
+
it "updates column name in validators table" do
|
107
|
+
db.validate_column :table_name, :column_name, :uniqueness => {:message => "some message"}
|
108
|
+
db.validate_column :table_name, :column_name1, :uniqueness => {:message => "some message"}
|
109
|
+
MigrationValidators::Core::DbValidator.commit
|
110
|
+
|
111
|
+
db.rename_column :table_name, :column_name1, :column_name2
|
112
|
+
MigrationValidators::Core::DbValidator.commit
|
113
|
+
|
114
|
+
MigrationValidators::Core::DbValidator.column_validators(:table_name, :column_name2).should_not be_blank
|
115
|
+
end
|
116
|
+
|
117
|
+
it "still renames column" do
|
118
|
+
db.rename_column :table_name, :column_name1, :column_name2
|
119
|
+
MigrationValidators::Core::DbValidator.commit
|
120
|
+
|
121
|
+
db.column_exists?(:table_name, :column_name1).should be_false
|
122
|
+
db.column_exists?(:table_name, :column_name2).should be_true
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe :rename_table do
|
127
|
+
it "updates table name in validators table" do
|
128
|
+
db.validate_column :table_name, :column_name, :uniqueness => {:message => "some message"}
|
129
|
+
MigrationValidators::Core::DbValidator.commit
|
130
|
+
|
131
|
+
db.rename_table :table_name, :new_table_name
|
132
|
+
MigrationValidators::Core::DbValidator.commit
|
133
|
+
|
134
|
+
MigrationValidators::Core::DbValidator.table_validators(:new_table_name).should_not be_blank
|
135
|
+
end
|
136
|
+
|
137
|
+
it "still renames table" do
|
138
|
+
db.rename_table :table_name, :new_table_name
|
139
|
+
|
140
|
+
db.table_exists?(:table_name).should be_false
|
141
|
+
db.table_exists?(:new_table_name).should be_true
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe :add_column do
|
146
|
+
before :each do
|
147
|
+
db.add_column :table_name, :new_column, :integer, :validates => {:uniqueness => true}
|
148
|
+
MigrationValidators::Core::DbValidator.commit
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should update validators table" do
|
152
|
+
MigrationValidators::Core::DbValidator.column_validators(:table_name, :new_column).should_not be_blank
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should still add column" do
|
156
|
+
db.column_exists?(:table_name, :new_column).should be_true
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe :change_column do
|
161
|
+
before :each do
|
162
|
+
db.add_column :table_name, :new_column, :integer, :validates => {:uniqueness => true}
|
163
|
+
MigrationValidators::Core::DbValidator.commit
|
164
|
+
|
165
|
+
db.change_column :table_name, :new_column, :string, :validates => {:presense => true}
|
166
|
+
MigrationValidators::Core::DbValidator.commit
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should update validators table" do
|
170
|
+
MigrationValidators::Core::DbValidator.column_validators(:table_name, :new_column).first.validator_name.should == "presense"
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should still change column" do
|
174
|
+
db.columns(:table_name).find{|col| col.name.to_sym == :new_column}.type.should == :string
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe :create_table do
|
179
|
+
before :each do
|
180
|
+
db.drop_table :created_table if db.table_exists?(:created_table)
|
181
|
+
db.create_table :created_table do |t|
|
182
|
+
t.column :column, :string, :validates => {:presense => true}
|
183
|
+
t.string :string_column, :validates => {:presense => true}
|
184
|
+
t.text :text_column, :validates => {:presense => true}
|
185
|
+
t.integer :integer_column, :validates => {:presense => true}
|
186
|
+
t.float :float_column, :validates => {:presense => true}
|
187
|
+
t.decimal :decimal_column, :validates => {:presense => true}
|
188
|
+
t.datetime :datetime_column, :validates => {:presense => true}
|
189
|
+
t.time :time_column, :validates => {:presense => true}
|
190
|
+
t.date :date_column, :validates => {:presense => true}
|
191
|
+
t.binary :binary_column, :validates => {:presense => true}
|
192
|
+
t.boolean :boolean_column, :validates => {:presense => true}
|
193
|
+
end
|
194
|
+
|
195
|
+
MigrationValidators::Core::DbValidator.commit
|
196
|
+
end
|
197
|
+
|
198
|
+
it "with generall column should update validators table" do
|
199
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :column).should_not be_blank
|
200
|
+
end
|
201
|
+
|
202
|
+
it "with string column should update validators table" do
|
203
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :string_column).should_not be_blank
|
204
|
+
end
|
205
|
+
|
206
|
+
it "with text column should update validators table" do
|
207
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :text_column).should_not be_blank
|
208
|
+
end
|
209
|
+
|
210
|
+
it "with integer column should update validators table" do
|
211
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :integer_column).should_not be_blank
|
212
|
+
end
|
213
|
+
|
214
|
+
it "with float column should update validators table" do
|
215
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :float_column).should_not be_blank
|
216
|
+
end
|
217
|
+
|
218
|
+
it "with decimal column should update validators table" do
|
219
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :decimal_column).should_not be_blank
|
220
|
+
end
|
221
|
+
|
222
|
+
it "with datetime column should update validators table" do
|
223
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :datetime_column).should_not be_blank
|
224
|
+
end
|
225
|
+
|
226
|
+
it "with time column should update validators table" do
|
227
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :time_column).should_not be_blank
|
228
|
+
end
|
229
|
+
|
230
|
+
it "with date column should update validators table" do
|
231
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :date_column).should_not be_blank
|
232
|
+
end
|
233
|
+
|
234
|
+
it "with binary column should update validators table" do
|
235
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :binary_column).should_not be_blank
|
236
|
+
end
|
237
|
+
|
238
|
+
it "with boolean column should update validators table" do
|
239
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :boolean_column).should_not be_blank
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
describe :change_table do
|
245
|
+
describe "create_columns" do
|
246
|
+
before :each do
|
247
|
+
db.drop_table :created_table if db.table_exists?(:created_table)
|
248
|
+
db.create_table(:created_table) {|t| t.string :dummy_column }
|
249
|
+
db.change_table :created_table do |t|
|
250
|
+
t.column :column, :string, :validates => {:presense => true}
|
251
|
+
t.string :string_column, :validates => {:presense => true}
|
252
|
+
t.text :text_column, :validates => {:presense => true}
|
253
|
+
t.integer :integer_column, :validates => {:presense => true}
|
254
|
+
t.float :float_column, :validates => {:presense => true}
|
255
|
+
t.decimal :decimal_column, :validates => {:presense => true}
|
256
|
+
t.datetime :datetime_column, :validates => {:presense => true}
|
257
|
+
t.time :time_column, :validates => {:presense => true}
|
258
|
+
t.date :date_column, :validates => {:presense => true}
|
259
|
+
t.binary :binary_column, :validates => {:presense => true}
|
260
|
+
t.boolean :boolean_column, :validates => {:presense => true}
|
261
|
+
end
|
262
|
+
|
263
|
+
MigrationValidators::Core::DbValidator.commit
|
264
|
+
end
|
265
|
+
|
266
|
+
it "with generall column should update validators table" do
|
267
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :column).should_not be_blank
|
268
|
+
end
|
269
|
+
|
270
|
+
it "with string column should update validators table" do
|
271
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :string_column).should_not be_blank
|
272
|
+
end
|
273
|
+
|
274
|
+
it "with text column should update validators table" do
|
275
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :text_column).should_not be_blank
|
276
|
+
end
|
277
|
+
|
278
|
+
it "with integer column should update validators table" do
|
279
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :integer_column).should_not be_blank
|
280
|
+
end
|
281
|
+
|
282
|
+
it "with float column should update validators table" do
|
283
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :float_column).should_not be_blank
|
284
|
+
end
|
285
|
+
|
286
|
+
it "with decimal column should update validators table" do
|
287
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :decimal_column).should_not be_blank
|
288
|
+
end
|
289
|
+
|
290
|
+
it "with datetime column should update validators table" do
|
291
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :datetime_column).should_not be_blank
|
292
|
+
end
|
293
|
+
|
294
|
+
it "with time column should update validators table" do
|
295
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :time_column).should_not be_blank
|
296
|
+
end
|
297
|
+
|
298
|
+
it "with date column should update validators table" do
|
299
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :date_column).should_not be_blank
|
300
|
+
end
|
301
|
+
|
302
|
+
it "with binary column should update validators table" do
|
303
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :binary_column).should_not be_blank
|
304
|
+
end
|
305
|
+
|
306
|
+
it "with boolean column should update validators table" do
|
307
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :boolean_column).should_not be_blank
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
describe "change_existing_columns" do
|
312
|
+
before :each do
|
313
|
+
db.drop_table :created_table if db.table_exists?(:created_table)
|
314
|
+
|
315
|
+
db.create_table :created_table do |t|
|
316
|
+
t.column :column, :string, :validates => {:presense => true}
|
317
|
+
t.column :column_1, :string, :validates => {:presense => true}
|
318
|
+
t.column :column_to_remove, :string, :validates => {:presense => true}
|
319
|
+
t.column :old_column_name, :string, :validates => {:presense => true}
|
320
|
+
end
|
321
|
+
|
322
|
+
MigrationValidators::Core::DbValidator.commit
|
323
|
+
|
324
|
+
|
325
|
+
db.change_table :created_table do |t|
|
326
|
+
t.change :column, :string, :validates => {:presense => false}
|
327
|
+
t.remove :column_to_remove
|
328
|
+
t.rename :old_column_name, :new_column_name
|
329
|
+
t.change_validates :column_1, :presense => false
|
330
|
+
end
|
331
|
+
|
332
|
+
MigrationValidators::Core::DbValidator.commit
|
333
|
+
end
|
334
|
+
|
335
|
+
it "with generall column should update validators table" do
|
336
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :column).should be_blank
|
337
|
+
end
|
338
|
+
|
339
|
+
it "should track column removing" do
|
340
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :column_to_remove).should be_blank
|
341
|
+
end
|
342
|
+
|
343
|
+
it "should trach column renaming" do
|
344
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :old_column_name).should be_blank
|
345
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :new_column_name).should_not be_blank
|
346
|
+
end
|
347
|
+
|
348
|
+
it "supports special change_validates method" do
|
349
|
+
MigrationValidators::Core::DbValidator.column_validators(:created_table, :column_1).should be_blank
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
|
355
|
+
describe "operations with validators" do
|
356
|
+
before :each do
|
357
|
+
db.create_table(:table_name) do |t|
|
358
|
+
t.string :column_name
|
359
|
+
end unless db.table_exists?(:table_name)
|
360
|
+
|
361
|
+
MigrationValidators::Core::DbValidator.remove_table_validators :table_name
|
362
|
+
MigrationValidators::Core::DbValidator.commit
|
363
|
+
end
|
364
|
+
|
365
|
+
describe :validate_column do
|
366
|
+
it "raises an exception if 0 validators defined" do
|
367
|
+
lambda {
|
368
|
+
db.validate_column :table_name, :column_name, {}
|
369
|
+
}.should raise_error(MigrationValidators::MigrationValidatorsException, /at least one column validator should be defined/)
|
370
|
+
end
|
371
|
+
|
372
|
+
it "adds all specified validators to the validator table" do
|
373
|
+
|
374
|
+
db.validate_column :table_name,
|
375
|
+
:column_name,
|
376
|
+
:uniqueness => {:message => "unique"},
|
377
|
+
:inclusion => {:message => "inclusion"}
|
378
|
+
MigrationValidators::Core::DbValidator.commit
|
379
|
+
|
380
|
+
MigrationValidators::Core::DbValidator.column_validators("table_name", "column_name").length.should == 2
|
381
|
+
end
|
382
|
+
|
383
|
+
it "stores validator options if they defined as hash" do
|
384
|
+
db.validate_column :table_name,
|
385
|
+
:column_name,
|
386
|
+
:uniqueness => {:message => "unique"}
|
387
|
+
MigrationValidators::Core::DbValidator.commit
|
388
|
+
|
389
|
+
|
390
|
+
MigrationValidators::Core::DbValidator.table_validators("table_name").first.options[:message].should == "unique"
|
391
|
+
end
|
392
|
+
|
393
|
+
it "should treat true in validator options as empty options list" do
|
394
|
+
db.validate_column :table_name,
|
395
|
+
:column_name,
|
396
|
+
:uniqueness => true
|
397
|
+
MigrationValidators::Core::DbValidator.commit
|
398
|
+
|
399
|
+
MigrationValidators::Core::DbValidator.table_validators("table_name").first.options.should == {}
|
400
|
+
end
|
401
|
+
|
402
|
+
it "should treat false in validator option as validator removing request" do
|
403
|
+
db.validate_column :table_name,
|
404
|
+
:column_name,
|
405
|
+
:uniqueness => true
|
406
|
+
MigrationValidators::Core::DbValidator.commit
|
407
|
+
|
408
|
+
db.validate_column :table_name,
|
409
|
+
:column_name,
|
410
|
+
:uniqueness => false
|
411
|
+
MigrationValidators::Core::DbValidator.commit
|
412
|
+
|
413
|
+
MigrationValidators::Core::DbValidator.table_validators(:table_name).should be_blank
|
414
|
+
end
|
415
|
+
|
416
|
+
it "should not allow nil instead of false as validator parameter" do
|
417
|
+
lambda {
|
418
|
+
db.validate_column :table_name,
|
419
|
+
:column_name,
|
420
|
+
:uniqueness => nil
|
421
|
+
MigrationValidators::Core::DbValidator.commit
|
422
|
+
}.should raise_error(MigrationValidators::MigrationValidatorsException, /use false to remove column validator/)
|
423
|
+
end
|
424
|
+
|
425
|
+
it "takes name of the context table if blank table name specified as parameter" do
|
426
|
+
db.in_context_of_table :table_name do
|
427
|
+
db.validate_column nil,
|
428
|
+
:column_name,
|
429
|
+
:uniqueness => true
|
430
|
+
MigrationValidators::Core::DbValidator.commit
|
431
|
+
end
|
432
|
+
|
433
|
+
MigrationValidators::Core::DbValidator.column_validators("table_name", "column_name").length.should == 1
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
437
|
+
describe :validate_table, "supports" do
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|