mv-core 1.0.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +67 -12
- data/lib/mv-core.rb +18 -100
- data/lib/mv/core/active_record/connection_adapters/abstract_adapter_decorator.rb +51 -0
- data/lib/mv/core/active_record/connection_adapters/table_decorator.rb +13 -0
- data/lib/mv/core/active_record/connection_adapters/table_definition_decorator.rb +21 -0
- data/lib/mv/core/active_record/migration/command_recorder_decorator.rb +13 -0
- data/lib/mv/core/active_record/migration_decorator.rb +14 -0
- data/lib/mv/core/active_record/schema_decorator.rb +16 -0
- data/lib/mv/core/active_record/schema_dumper_decorator.rb +29 -0
- data/lib/mv/core/constraint/base.rb +33 -0
- data/lib/mv/core/constraint/builder/base.rb +45 -0
- data/lib/mv/core/constraint/builder/factory.rb +42 -0
- data/lib/mv/core/constraint/builder/index.rb +50 -0
- data/lib/mv/core/constraint/builder/trigger.rb +13 -0
- data/lib/mv/core/constraint/description.rb +24 -0
- data/lib/mv/core/constraint/factory.rb +33 -0
- data/lib/mv/core/constraint/index.rb +13 -0
- data/lib/mv/core/constraint/trigger.rb +20 -0
- data/lib/mv/core/db/helpers/column_validators.rb +57 -0
- data/lib/mv/core/db/helpers/table_validators.rb +38 -0
- data/lib/mv/core/db/migration_validator.rb +26 -0
- data/lib/mv/core/error.rb +25 -0
- data/lib/mv/core/migration/base.rb +94 -0
- data/lib/mv/core/migration/operations/add_column.rb +27 -0
- data/lib/mv/core/migration/operations/change_column.rb +31 -0
- data/lib/mv/core/migration/operations/drop_table.rb +21 -0
- data/lib/mv/core/migration/operations/factory.rb +20 -0
- data/lib/mv/core/migration/operations/list.rb +28 -0
- data/lib/mv/core/migration/operations/remove_column.rb +22 -0
- data/lib/mv/core/migration/operations/rename_column.rb +26 -0
- data/lib/mv/core/migration/operations/rename_table.rb +25 -0
- data/lib/mv/core/presenter/constraint/description.rb +26 -0
- data/lib/mv/core/presenter/validation/base.rb +73 -0
- data/lib/mv/core/railtie.rb +40 -0
- data/lib/mv/core/route/base.rb +25 -0
- data/lib/mv/core/route/index.rb +17 -0
- data/lib/mv/core/route/trigger.rb +22 -0
- data/lib/mv/core/router.rb +33 -0
- data/lib/mv/core/services/compare_constraint_arrays.rb +50 -0
- data/lib/mv/core/services/compare_constraints.rb +31 -0
- data/lib/mv/core/services/create_constraints.rb +30 -0
- data/lib/mv/core/services/create_migration_validators_table.rb +31 -0
- data/lib/mv/core/services/delete_constraints.rb +30 -0
- data/lib/mv/core/services/load_constraints.rb +45 -0
- data/lib/mv/core/services/say_constraints_diff.rb +66 -0
- data/lib/mv/core/services/show_constraints.rb +41 -0
- data/lib/mv/core/services/synchronize_constraints.rb +54 -0
- data/lib/mv/core/services/uninstall.rb +25 -0
- data/lib/mv/core/validation/absence.rb +35 -0
- data/lib/mv/core/validation/base.rb +98 -0
- data/lib/mv/core/validation/builder/absence.rb +19 -0
- data/lib/mv/core/validation/builder/base.rb +58 -0
- data/lib/mv/core/validation/builder/exclusion.rb +42 -0
- data/lib/mv/core/validation/builder/factory.rb +43 -0
- data/lib/mv/core/validation/builder/inclusion.rb +42 -0
- data/lib/mv/core/validation/builder/length.rb +68 -0
- data/lib/mv/core/validation/builder/presence.rb +19 -0
- data/lib/mv/core/validation/builder/uniqueness.rb +19 -0
- data/lib/mv/core/validation/exclusion.rb +27 -0
- data/lib/mv/core/validation/factory.rb +56 -0
- data/lib/mv/core/validation/inclusion.rb +27 -0
- data/lib/mv/core/validation/length.rb +59 -0
- data/lib/mv/core/validation/presence.rb +25 -0
- data/lib/mv/core/validation/uniqueness.rb +45 -0
- data/lib/mv/core/validators/array_validator.rb +5 -0
- data/lib/mv/core/validators/integers_array_validator.rb +12 -0
- data/lib/mv/core/validators/valid_validator.rb +9 -0
- metadata +158 -30
- data/lib/migration_validators/active_record/base.rb +0 -29
- data/lib/migration_validators/active_record/connection_adapters/abstract_adapter.rb +0 -38
- data/lib/migration_validators/active_record/connection_adapters/native_adapter.rb +0 -129
- data/lib/migration_validators/active_record/connection_adapters/table.rb +0 -17
- data/lib/migration_validators/active_record/connection_adapters/table_definition.rb +0 -33
- data/lib/migration_validators/active_record/migration.rb +0 -25
- data/lib/migration_validators/active_record/schema.rb +0 -32
- data/lib/migration_validators/active_record/schema_dumper.rb +0 -25
- data/lib/migration_validators/adapters/base.rb +0 -15
- data/lib/migration_validators/adapters/containers.rb +0 -100
- data/lib/migration_validators/adapters/routing.rb +0 -102
- data/lib/migration_validators/adapters/syntax.rb +0 -51
- data/lib/migration_validators/adapters/validator_definitions.rb +0 -132
- data/lib/migration_validators/core/adapter_wrapper.rb +0 -88
- data/lib/migration_validators/core/db_validator.rb +0 -131
- data/lib/migration_validators/core/statement_builder.rb +0 -61
- data/lib/migration_validators/core/validator_constraints_list.rb +0 -32
- data/lib/migration_validators/core/validator_container.rb +0 -110
- data/lib/migration_validators/core/validator_definition.rb +0 -91
- data/lib/migration_validators/core/validator_router.rb +0 -45
- data/lib/options.rb +0 -7
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'mv/core/validation/builder/factory'
|
2
|
+
|
3
|
+
module Mv
|
4
|
+
module Core
|
5
|
+
module Constraint
|
6
|
+
module Builder
|
7
|
+
class Base
|
8
|
+
attr_reader :constraint
|
9
|
+
|
10
|
+
delegate :name, to: :constraint
|
11
|
+
|
12
|
+
def initialize(constraint)
|
13
|
+
@constraint = constraint
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete
|
20
|
+
end
|
21
|
+
|
22
|
+
def update new_constraint_builder
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.validation_builders_factory
|
26
|
+
@validation_builders_factory ||= Mv::Core::Validation::Builder::Factory.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def validation_builders
|
30
|
+
@validation_builders ||= constraint.validations.collect do |validation|
|
31
|
+
self.class.validation_builders_factory.create_builder(validation)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
|
38
|
+
def db
|
39
|
+
::ActiveRecord::Base.connection
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'mv/core/constraint/builder/index'
|
2
|
+
require 'mv/core/constraint/builder/trigger'
|
3
|
+
|
4
|
+
module Mv
|
5
|
+
module Core
|
6
|
+
module Constraint
|
7
|
+
module Builder
|
8
|
+
class Factory
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
def create_builder constraint
|
12
|
+
factory_map[constraint.class].new(constraint)
|
13
|
+
end
|
14
|
+
|
15
|
+
def register_builder constraint_class, builder_class
|
16
|
+
factory_map[constraint_class] = builder_class
|
17
|
+
end
|
18
|
+
|
19
|
+
def register_builders opts
|
20
|
+
opts.each do |constraint_class, builder_class|
|
21
|
+
register_builder(constraint_class, builder_class)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class << self
|
26
|
+
delegate :create_builder, :register_builder, :register_builders, to: :instance
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def factory_map
|
33
|
+
@factory_map ||= {
|
34
|
+
Mv::Core::Constraint::Index => Mv::Core::Constraint::Builder::Index,
|
35
|
+
Mv::Core::Constraint::Trigger => Mv::Core::Constraint::Builder::Trigger
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'mv/core/constraint/builder/base'
|
2
|
+
|
3
|
+
module Mv
|
4
|
+
module Core
|
5
|
+
module Constraint
|
6
|
+
module Builder
|
7
|
+
class Index < Base
|
8
|
+
def create
|
9
|
+
super
|
10
|
+
|
11
|
+
constraint.validations.group_by(&:table_name).each do |table_name, validations|
|
12
|
+
remove_index(table_name)
|
13
|
+
add_index(table_name, validations.collect(&:column_name))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete
|
18
|
+
super
|
19
|
+
|
20
|
+
constraint.validations.group_by(&:table_name).each do |table_name, validations|
|
21
|
+
remove_index(table_name)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def update new_constraint_builder
|
26
|
+
super
|
27
|
+
|
28
|
+
delete
|
29
|
+
new_constraint_builder.create
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def index_exists?(table_name)
|
35
|
+
db.table_exists?(table_name) &&
|
36
|
+
db.index_name_exists?(table_name, name, false)
|
37
|
+
end
|
38
|
+
|
39
|
+
def remove_index(table_name)
|
40
|
+
db.remove_index!(table_name, name) if index_exists?(table_name)
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_index(table_name, columns)
|
44
|
+
db.add_index(table_name, columns, name: name, unique: true)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Mv
|
2
|
+
module Core
|
3
|
+
module Constraint
|
4
|
+
class Description
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
attr_reader :name, :type, :options
|
8
|
+
|
9
|
+
def initialize name, type, options = {}
|
10
|
+
@name = name.to_sym
|
11
|
+
@type = type.to_sym
|
12
|
+
@options = options.inject({}) do |res, (name, value)|
|
13
|
+
res[name.to_sym] = value.to_s
|
14
|
+
res
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def <=> other_info
|
19
|
+
[name, type, options] <=> [other_info.name, other_info.type, other_info.options]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'mv/core/constraint/trigger'
|
2
|
+
require 'mv/core/constraint/index'
|
3
|
+
|
4
|
+
module Mv
|
5
|
+
module Core
|
6
|
+
module Constraint
|
7
|
+
class Factory
|
8
|
+
include Singleton
|
9
|
+
|
10
|
+
def create_constraint description
|
11
|
+
factory_map[description.type.to_sym].new(description)
|
12
|
+
end
|
13
|
+
|
14
|
+
def register_constraint type, klass
|
15
|
+
factory_map[type.to_sym] = klass
|
16
|
+
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
delegate :create_constraint, :register_constraint, to: :instance
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def factory_map
|
25
|
+
@factory_map ||= {
|
26
|
+
trigger: Mv::Core::Constraint::Trigger,
|
27
|
+
index: Mv::Core::Constraint::Index
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'mv/core/constraint/base'
|
2
|
+
|
3
|
+
module Mv
|
4
|
+
module Core
|
5
|
+
module Constraint
|
6
|
+
class Trigger < Base
|
7
|
+
attr_reader :event
|
8
|
+
|
9
|
+
def initialize description
|
10
|
+
super
|
11
|
+
@event = @description.options[:event].try(:to_sym)
|
12
|
+
end
|
13
|
+
|
14
|
+
def update?
|
15
|
+
event == :update
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'mv/core/db/helpers/table_validators'
|
2
|
+
|
3
|
+
module Mv
|
4
|
+
module Core
|
5
|
+
module Db
|
6
|
+
module Helpers
|
7
|
+
module ColumnValidators
|
8
|
+
include TableValidators
|
9
|
+
|
10
|
+
attr_accessor :column_name
|
11
|
+
|
12
|
+
def column_validators
|
13
|
+
table_validators.where(column_name: column_name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_column_validator validation_type, opts
|
17
|
+
raise_column_validation_error(validation_type, opts) if opts == false
|
18
|
+
|
19
|
+
update_column_validator(validation_type, opts)
|
20
|
+
end
|
21
|
+
|
22
|
+
def delete_column_validator
|
23
|
+
delete_validators(column_validators) > 0
|
24
|
+
end
|
25
|
+
|
26
|
+
def update_column_validator validation_type, opts
|
27
|
+
return delete_validators(column_validators.where(validation_type: validation_type)) if opts == false
|
28
|
+
|
29
|
+
column_validators.where(validation_type: validation_type).first_or_initialize.tap do |validator|
|
30
|
+
validator.options = normalize_opts(opts)
|
31
|
+
end.save!
|
32
|
+
end
|
33
|
+
|
34
|
+
def rename_column new_column_name
|
35
|
+
column_validators.update_all(column_name: new_column_name)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def normalize_opts opts
|
41
|
+
opts == true ? {} : opts
|
42
|
+
end
|
43
|
+
|
44
|
+
def raise_column_validation_error validation_type, opts
|
45
|
+
raise Mv::Core::Error.new(
|
46
|
+
table_name: table_name,
|
47
|
+
column_name: column_name,
|
48
|
+
validation_type: validation_type,
|
49
|
+
options: opts,
|
50
|
+
error: 'Validator can not be removed when new column is being added'
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'mv/core/db/migration_validator'
|
2
|
+
|
3
|
+
module Mv
|
4
|
+
module Core
|
5
|
+
module Db
|
6
|
+
module Helpers
|
7
|
+
module TableValidators
|
8
|
+
attr_accessor :table_name
|
9
|
+
|
10
|
+
def table_validators
|
11
|
+
Mv::Core::Db::MigrationValidator.where(table_name: table_name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def delete_table_validators
|
15
|
+
delete_validators(table_validators)
|
16
|
+
end
|
17
|
+
|
18
|
+
def update_table_validators new_table_name
|
19
|
+
table_validators.update_all(table_name: new_table_name)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def say(message)
|
25
|
+
::ActiveRecord::Migration.say(message, true)
|
26
|
+
end
|
27
|
+
|
28
|
+
def delete_validators validators
|
29
|
+
validators.each do |validator|
|
30
|
+
validator.destroy
|
31
|
+
end
|
32
|
+
validators.length
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'mv/core/validation/factory'
|
2
|
+
require 'mv/core/constraint/description'
|
3
|
+
require 'mv/core/validators/valid_validator'
|
4
|
+
|
5
|
+
module Mv
|
6
|
+
module Core
|
7
|
+
module Db
|
8
|
+
class MigrationValidator < ::ActiveRecord::Base
|
9
|
+
serialize :options, Hash
|
10
|
+
|
11
|
+
validates :table_name, presence: true
|
12
|
+
validates :column_name, presence: true
|
13
|
+
validates :validation_type, presence: true
|
14
|
+
|
15
|
+
validates :validation, valid: true
|
16
|
+
|
17
|
+
def validation
|
18
|
+
Mv::Core::Validation::Factory.create_validation(table_name,
|
19
|
+
column_name,
|
20
|
+
validation_type,
|
21
|
+
options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Mv
|
2
|
+
module Core
|
3
|
+
class Error < StandardError
|
4
|
+
attr_reader :table_name, :column_name, :validation_type, :options, :error
|
5
|
+
|
6
|
+
def initialize(opts = {})
|
7
|
+
opts = opts.with_indifferent_access
|
8
|
+
|
9
|
+
@table_name = opts[:table_name]
|
10
|
+
@column_name = opts[:column_name]
|
11
|
+
@validation_type = opts[:validation_type]
|
12
|
+
@options = opts[:options]
|
13
|
+
@error = opts[:error]
|
14
|
+
|
15
|
+
super [
|
16
|
+
@table_name ? "table: '#{@table_name}'" : nil,
|
17
|
+
@column_name ? "column: '#{@column_name}'" : nil,
|
18
|
+
@validation_type ? "validation: '#{@validation_type}'" : nil,
|
19
|
+
@options ? "options: '#{@options}'" : nil,
|
20
|
+
@error ? "error: '#{@error}'" : nil,
|
21
|
+
].compact.join(', ')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'mv/core/db/migration_validator'
|
2
|
+
require 'mv/core/migration/operations/list'
|
3
|
+
require 'mv/core/migration/operations/factory'
|
4
|
+
require 'mv/core/services/load_constraints'
|
5
|
+
require 'mv/core/services/compare_constraint_arrays'
|
6
|
+
require 'mv/core/services/synchronize_constraints'
|
7
|
+
require 'mv/core/services/create_migration_validators_table.rb'
|
8
|
+
|
9
|
+
module Mv
|
10
|
+
module Core
|
11
|
+
module Migration
|
12
|
+
class Base
|
13
|
+
include Singleton
|
14
|
+
|
15
|
+
SUPPORTED_METHODS = %i{ add_column remove_column rename_column
|
16
|
+
change_column rename_table drop_table}
|
17
|
+
|
18
|
+
attr_reader :operations_list, :operations_factory
|
19
|
+
|
20
|
+
def initialize()
|
21
|
+
@operations_list = Mv::Core::Migration::Operations::List.new
|
22
|
+
@operations_factory = Mv::Core::Migration::Operations::Factory.new()
|
23
|
+
end
|
24
|
+
|
25
|
+
SUPPORTED_METHODS.each do |operation_name|
|
26
|
+
define_method operation_name do |*args|
|
27
|
+
|
28
|
+
unless disabled_validations?
|
29
|
+
operation = operations_factory.create_operation(operation_name, *args)
|
30
|
+
operations_list.add_operation(operation)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def execute
|
36
|
+
if operations_list.present?
|
37
|
+
Mv::Core::Services::CreateMigrationValidatorsTable.new.execute
|
38
|
+
|
39
|
+
constraints_loader = Mv::Core::Services::LoadConstraints.new(operations_list.tables)
|
40
|
+
|
41
|
+
old_constraints = constraints_loader.execute
|
42
|
+
|
43
|
+
operations_list.execute()
|
44
|
+
|
45
|
+
new_constraints = constraints_loader.execute
|
46
|
+
|
47
|
+
constraints_comparizon = Mv::Core::Services::CompareConstraintArrays.new(old_constraints, new_constraints)
|
48
|
+
.execute
|
49
|
+
|
50
|
+
Mv::Core::Services::SynchronizeConstraints.new(constraints_comparizon[:added],
|
51
|
+
constraints_comparizon[:updated],
|
52
|
+
constraints_comparizon[:deleted])
|
53
|
+
.execute
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def add_column table_name, column_name, opts
|
58
|
+
return unless opts.present?
|
59
|
+
|
60
|
+
unless disabled_validations?
|
61
|
+
operation = operations_factory.create_operation(:add_column, table_name, column_name, opts)
|
62
|
+
operations_list.add_operation(operation)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def with_suppressed_validations
|
67
|
+
disable_validations!
|
68
|
+
yield
|
69
|
+
enable_validations!
|
70
|
+
end
|
71
|
+
|
72
|
+
class << self
|
73
|
+
alias_method :current, :instance
|
74
|
+
|
75
|
+
delegate *[SUPPORTED_METHODS, :execute, :with_suppressed_validations].flatten, to: :current, allow_nil: true
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def disabled_validations?
|
81
|
+
!!@disabled_validations
|
82
|
+
end
|
83
|
+
|
84
|
+
def disable_validations!
|
85
|
+
@disabled_validations = true
|
86
|
+
end
|
87
|
+
|
88
|
+
def enable_validations!
|
89
|
+
@disabled_validations = false
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|