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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +67 -12
  3. data/lib/mv-core.rb +18 -100
  4. data/lib/mv/core/active_record/connection_adapters/abstract_adapter_decorator.rb +51 -0
  5. data/lib/mv/core/active_record/connection_adapters/table_decorator.rb +13 -0
  6. data/lib/mv/core/active_record/connection_adapters/table_definition_decorator.rb +21 -0
  7. data/lib/mv/core/active_record/migration/command_recorder_decorator.rb +13 -0
  8. data/lib/mv/core/active_record/migration_decorator.rb +14 -0
  9. data/lib/mv/core/active_record/schema_decorator.rb +16 -0
  10. data/lib/mv/core/active_record/schema_dumper_decorator.rb +29 -0
  11. data/lib/mv/core/constraint/base.rb +33 -0
  12. data/lib/mv/core/constraint/builder/base.rb +45 -0
  13. data/lib/mv/core/constraint/builder/factory.rb +42 -0
  14. data/lib/mv/core/constraint/builder/index.rb +50 -0
  15. data/lib/mv/core/constraint/builder/trigger.rb +13 -0
  16. data/lib/mv/core/constraint/description.rb +24 -0
  17. data/lib/mv/core/constraint/factory.rb +33 -0
  18. data/lib/mv/core/constraint/index.rb +13 -0
  19. data/lib/mv/core/constraint/trigger.rb +20 -0
  20. data/lib/mv/core/db/helpers/column_validators.rb +57 -0
  21. data/lib/mv/core/db/helpers/table_validators.rb +38 -0
  22. data/lib/mv/core/db/migration_validator.rb +26 -0
  23. data/lib/mv/core/error.rb +25 -0
  24. data/lib/mv/core/migration/base.rb +94 -0
  25. data/lib/mv/core/migration/operations/add_column.rb +27 -0
  26. data/lib/mv/core/migration/operations/change_column.rb +31 -0
  27. data/lib/mv/core/migration/operations/drop_table.rb +21 -0
  28. data/lib/mv/core/migration/operations/factory.rb +20 -0
  29. data/lib/mv/core/migration/operations/list.rb +28 -0
  30. data/lib/mv/core/migration/operations/remove_column.rb +22 -0
  31. data/lib/mv/core/migration/operations/rename_column.rb +26 -0
  32. data/lib/mv/core/migration/operations/rename_table.rb +25 -0
  33. data/lib/mv/core/presenter/constraint/description.rb +26 -0
  34. data/lib/mv/core/presenter/validation/base.rb +73 -0
  35. data/lib/mv/core/railtie.rb +40 -0
  36. data/lib/mv/core/route/base.rb +25 -0
  37. data/lib/mv/core/route/index.rb +17 -0
  38. data/lib/mv/core/route/trigger.rb +22 -0
  39. data/lib/mv/core/router.rb +33 -0
  40. data/lib/mv/core/services/compare_constraint_arrays.rb +50 -0
  41. data/lib/mv/core/services/compare_constraints.rb +31 -0
  42. data/lib/mv/core/services/create_constraints.rb +30 -0
  43. data/lib/mv/core/services/create_migration_validators_table.rb +31 -0
  44. data/lib/mv/core/services/delete_constraints.rb +30 -0
  45. data/lib/mv/core/services/load_constraints.rb +45 -0
  46. data/lib/mv/core/services/say_constraints_diff.rb +66 -0
  47. data/lib/mv/core/services/show_constraints.rb +41 -0
  48. data/lib/mv/core/services/synchronize_constraints.rb +54 -0
  49. data/lib/mv/core/services/uninstall.rb +25 -0
  50. data/lib/mv/core/validation/absence.rb +35 -0
  51. data/lib/mv/core/validation/base.rb +98 -0
  52. data/lib/mv/core/validation/builder/absence.rb +19 -0
  53. data/lib/mv/core/validation/builder/base.rb +58 -0
  54. data/lib/mv/core/validation/builder/exclusion.rb +42 -0
  55. data/lib/mv/core/validation/builder/factory.rb +43 -0
  56. data/lib/mv/core/validation/builder/inclusion.rb +42 -0
  57. data/lib/mv/core/validation/builder/length.rb +68 -0
  58. data/lib/mv/core/validation/builder/presence.rb +19 -0
  59. data/lib/mv/core/validation/builder/uniqueness.rb +19 -0
  60. data/lib/mv/core/validation/exclusion.rb +27 -0
  61. data/lib/mv/core/validation/factory.rb +56 -0
  62. data/lib/mv/core/validation/inclusion.rb +27 -0
  63. data/lib/mv/core/validation/length.rb +59 -0
  64. data/lib/mv/core/validation/presence.rb +25 -0
  65. data/lib/mv/core/validation/uniqueness.rb +45 -0
  66. data/lib/mv/core/validators/array_validator.rb +5 -0
  67. data/lib/mv/core/validators/integers_array_validator.rb +12 -0
  68. data/lib/mv/core/validators/valid_validator.rb +9 -0
  69. metadata +158 -30
  70. data/lib/migration_validators/active_record/base.rb +0 -29
  71. data/lib/migration_validators/active_record/connection_adapters/abstract_adapter.rb +0 -38
  72. data/lib/migration_validators/active_record/connection_adapters/native_adapter.rb +0 -129
  73. data/lib/migration_validators/active_record/connection_adapters/table.rb +0 -17
  74. data/lib/migration_validators/active_record/connection_adapters/table_definition.rb +0 -33
  75. data/lib/migration_validators/active_record/migration.rb +0 -25
  76. data/lib/migration_validators/active_record/schema.rb +0 -32
  77. data/lib/migration_validators/active_record/schema_dumper.rb +0 -25
  78. data/lib/migration_validators/adapters/base.rb +0 -15
  79. data/lib/migration_validators/adapters/containers.rb +0 -100
  80. data/lib/migration_validators/adapters/routing.rb +0 -102
  81. data/lib/migration_validators/adapters/syntax.rb +0 -51
  82. data/lib/migration_validators/adapters/validator_definitions.rb +0 -132
  83. data/lib/migration_validators/core/adapter_wrapper.rb +0 -88
  84. data/lib/migration_validators/core/db_validator.rb +0 -131
  85. data/lib/migration_validators/core/statement_builder.rb +0 -61
  86. data/lib/migration_validators/core/validator_constraints_list.rb +0 -32
  87. data/lib/migration_validators/core/validator_container.rb +0 -110
  88. data/lib/migration_validators/core/validator_definition.rb +0 -91
  89. data/lib/migration_validators/core/validator_router.rb +0 -45
  90. data/lib/options.rb +0 -7
@@ -0,0 +1,50 @@
1
+ module Mv
2
+ module Core
3
+ module Services
4
+ class CompareConstraintArrays
5
+ attr_reader :old_constraints, :new_constraints
6
+
7
+ def initialize(old_constraints, new_constraints)
8
+ @old_constraints = old_constraints
9
+ @new_constraints = new_constraints
10
+ end
11
+
12
+ def execute
13
+ {
14
+ deleted: deleted_constraints,
15
+ updated: updated_constraints,
16
+ added: added_constraints
17
+ }.delete_if{ |key, value| value.blank? }
18
+ end
19
+
20
+ private
21
+
22
+ def deleted_constraints
23
+ old_constraints.select do |old_constraint|
24
+ new_constraints.none? do |new_constraint|
25
+ old_constraint.description == new_constraint.description
26
+ end
27
+ end
28
+ end
29
+
30
+ def updated_constraints
31
+ old_constraints.inject([]) do |res, old_constraint|
32
+ new_constraints.select do |new_constraint|
33
+ old_constraint.description == new_constraint.description &&
34
+ old_constraint.validations.sort != new_constraint.validations.sort
35
+ end.each{|new_constraint| res << [old_constraint, new_constraint]}
36
+ res
37
+ end
38
+ end
39
+
40
+ def added_constraints
41
+ new_constraints.select do |new_constraint|
42
+ old_constraints.none? do |old_constraint|
43
+ old_constraint.description == new_constraint.description
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,31 @@
1
+ module Mv
2
+ module Core
3
+ module Services
4
+ class CompareConstraints
5
+ attr_reader :old_constraint, :new_constraint
6
+
7
+ def initialize(old_constraint, new_constraint)
8
+ @old_constraint = old_constraint
9
+ @new_constraint = new_constraint
10
+ end
11
+
12
+ def execute
13
+ {
14
+ deleted: old_validations - new_validations,
15
+ added: new_validations - old_validations
16
+ }.delete_if{ |key, value| value.blank? }
17
+ end
18
+
19
+ private
20
+
21
+ def old_validations
22
+ @old_validations ||= old_constraint.try(:validations) || []
23
+ end
24
+
25
+ def new_validations
26
+ @new_validations ||= new_constraint.try(:validations) || []
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ require 'mv/core/services/load_constraints'
2
+
3
+ module Mv
4
+ module Core
5
+ module Services
6
+ class CreateConstraints
7
+ attr_reader :tables
8
+
9
+ def initialize(tables)
10
+ @tables = tables.present? ? tables : Mv::Core::Db::MigrationValidator.pluck(:table_name)
11
+ end
12
+
13
+ def execute
14
+ constraints_comparizon = Mv::Core::Services::CompareConstraintArrays.new([], existing_constraints)
15
+ .execute
16
+ Mv::Core::Services::SynchronizeConstraints.new(constraints_comparizon[:added],
17
+ constraints_comparizon[:updated],
18
+ constraints_comparizon[:deleted])
19
+ .execute
20
+ end
21
+
22
+ private
23
+
24
+ def existing_constraints
25
+ Mv::Core::Services::LoadConstraints.new(tables).execute
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ module Mv
2
+ module Core
3
+ module Services
4
+ class CreateMigrationValidatorsTable
5
+ attr_reader :db
6
+ delegate :create_table, :table_exists?, :add_index, to: :db
7
+
8
+ def initialize db = ::ActiveRecord::Base.connection
9
+ @db = db
10
+ end
11
+
12
+ def execute
13
+ unless table_exists?(:migration_validators)
14
+ ::ActiveRecord::Migration.say_with_time('initialize migration_validators table') do
15
+ create_table(:migration_validators) do |table|
16
+ table.string :table_name, null: false
17
+ table.string :column_name, null: false
18
+ table.string :validation_type, null: false
19
+ table.string :options
20
+ end
21
+
22
+ add_index(:migration_validators,
23
+ [:table_name, :column_name, :validation_type],
24
+ name: 'unique_idx_on_migration_validators')
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ require 'mv/core/services/load_constraints'
2
+
3
+ module Mv
4
+ module Core
5
+ module Services
6
+ class DeleteConstraints
7
+ attr_reader :tables
8
+
9
+ def initialize(tables = [])
10
+ @tables = tables.present? ? tables : Mv::Core::Db::MigrationValidator.pluck(:table_name)
11
+ end
12
+
13
+ def execute
14
+ constraints_comparizon = Mv::Core::Services::CompareConstraintArrays.new(existing_constraints, [])
15
+ .execute
16
+ Mv::Core::Services::SynchronizeConstraints.new(constraints_comparizon[:added],
17
+ constraints_comparizon[:updated],
18
+ constraints_comparizon[:deleted])
19
+ .execute
20
+ end
21
+
22
+ private
23
+
24
+ def existing_constraints
25
+ Mv::Core::Services::LoadConstraints.new(tables).execute
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,45 @@
1
+ require 'mv/core/db/migration_validator'
2
+ require 'mv/core/router'
3
+ require 'mv/core/constraint/factory'
4
+
5
+ module Mv
6
+ module Core
7
+ module Services
8
+ class LoadConstraints
9
+ attr_reader :tables
10
+
11
+ def initialize(tables)
12
+ @tables = tables
13
+ end
14
+
15
+ def execute
16
+ res = []
17
+
18
+ Mv::Core::Db::MigrationValidator.where(table_name: tables).each do |migration_validator|
19
+ validation = migration_validator.validation
20
+ descriptions = Mv::Core::Router.route(validation)
21
+
22
+ descriptions.each do |description|
23
+ add_constraint(res, description).validations << validation
24
+ end
25
+ end
26
+
27
+ return res
28
+ end
29
+
30
+ private
31
+
32
+ def add_constraint(constraints_list, description)
33
+ res = constraints_list.find{|constraint| constraint.description == description}
34
+
35
+ unless res
36
+ res = Mv::Core::Constraint::Factory.create_constraint(description)
37
+ constraints_list << res
38
+ end
39
+
40
+ res
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,66 @@
1
+ require 'mv/core/services/compare_constraints'
2
+ require 'mv/core/presenter/validation/base'
3
+ require 'mv/core/presenter/constraint/description'
4
+
5
+ module Mv
6
+ module Core
7
+ module Services
8
+ class SayConstraintsDiff
9
+ attr_reader :old_constraint, :new_constraint
10
+
11
+ def initialize(old_constraint, new_constraint)
12
+ @old_constraint = old_constraint
13
+ @new_constraint = new_constraint
14
+ end
15
+
16
+ def execute
17
+ ::ActiveRecord::Migration.say_with_time("#{constraint_operation} #{constraint_presenter} on table \"#{table_name}\"") do
18
+ comparison[:deleted].each do |validation|
19
+ say("delete #{validation_presenter(validation)}")
20
+ end if comparison[:deleted]
21
+
22
+ comparison[:added].each do |validation|
23
+ say("create #{validation_presenter(validation)}")
24
+ end if comparison[:added]
25
+
26
+ yield
27
+ end unless comparison.blank?
28
+ end
29
+
30
+ private
31
+
32
+ def constraint_operation
33
+ return 'create' unless old_constraint
34
+ return 'delete' unless new_constraint
35
+ 'update'
36
+ end
37
+
38
+ def table_name
39
+ old_constraint.try(:validations).try(:first).try(:table_name) ||
40
+ new_constraint.try(:validations).try(:first).try(:table_name)
41
+ end
42
+
43
+ def constraint_presenter
44
+ Mv::Core::Presenter::Constraint::Description.new((old_constraint || new_constraint).description)
45
+ end
46
+
47
+ def validation_presenter validation
48
+ Mv::Core::Presenter::Validation::Base.new(validation)
49
+ end
50
+
51
+ def comparison
52
+ @comparison ||= Mv::Core::Services::CompareConstraints.new(old_constraint, new_constraint)
53
+ .execute
54
+ end
55
+
56
+ def say_with_time msg, &block
57
+ ::ActiveRecord::Migration.say_with_time(msg, &block)
58
+ end
59
+
60
+ def say msg
61
+ ::ActiveRecord::Migration.say(msg, true)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,41 @@
1
+ require 'mv/core/services/load_constraints'
2
+ require 'mv/core/presenter/constraint/description'
3
+ require 'mv/core/presenter/validation/base'
4
+
5
+ module Mv
6
+ module Core
7
+ module Services
8
+ class ShowConstraints
9
+ attr_reader :tables
10
+
11
+ def initialize(tables)
12
+ @tables = tables.present? ? tables : Mv::Core::Db::MigrationValidator.pluck(:table_name)
13
+ end
14
+
15
+ def execute
16
+ existing_constraints.each do |constraint|
17
+ say_with_time("#{Mv::Core::Presenter::Constraint::Description.new(constraint.description)}") do
18
+ constraint.validations.each do |validation|
19
+ say("#{Mv::Core::Presenter::Validation::Base.new(validation)}")
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def say_with_time msg, &block
28
+ ::ActiveRecord::Migration::say_with_time(msg, &block)
29
+ end
30
+
31
+ def say msg
32
+ ::ActiveRecord::Migration::say(msg, true)
33
+ end
34
+
35
+ def existing_constraints
36
+ Mv::Core::Services::LoadConstraints.new(tables).execute
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,54 @@
1
+ require 'mv/core/constraint/builder/factory'
2
+ require 'mv/core/services/say_constraints_diff'
3
+
4
+ module Mv
5
+ module Core
6
+ module Services
7
+ class SynchronizeConstraints
8
+ attr_reader :additions, :updates, :deletions
9
+
10
+ def initialize(additions, updates, deletions)
11
+ @additions = additions
12
+ @updates = updates
13
+ @deletions = deletions
14
+ end
15
+
16
+ def execute
17
+ delete
18
+ update
19
+ create
20
+ end
21
+
22
+ private
23
+
24
+ def builder(constraint)
25
+ Mv::Core::Constraint::Builder::Factory.create_builder(constraint)
26
+ end
27
+
28
+ def delete
29
+ deletions.each do |constraint_to_delete|
30
+ Mv::Core::Services::SayConstraintsDiff.new(constraint_to_delete, nil).execute do
31
+ builder(constraint_to_delete).delete
32
+ end
33
+ end if deletions
34
+ end
35
+
36
+ def update
37
+ updates.each do |old_constraint, new_constraint|
38
+ Mv::Core::Services::SayConstraintsDiff.new(old_constraint, new_constraint).execute do
39
+ builder(old_constraint).update(builder(new_constraint))
40
+ end
41
+ end if updates
42
+ end
43
+
44
+ def create
45
+ additions.each do |constraint_to_be_added|
46
+ Mv::Core::Services::SayConstraintsDiff.new(nil, constraint_to_be_added).execute do
47
+ builder(constraint_to_be_added).create
48
+ end
49
+ end if additions
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,25 @@
1
+ require 'mv/core/services/delete_constraints'
2
+
3
+ module Mv
4
+ module Core
5
+ module Services
6
+ class Uninstall
7
+ def execute
8
+ if db.table_exists?(:migration_validators)
9
+ Mv::Core::Services::DeleteConstraints.new.execute
10
+
11
+ ::ActiveRecord::Migration.say_with_time('drop migration_validators table') do
12
+ db.drop_table(:migration_validators)
13
+ end
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def db
20
+ ::ActiveRecord::Base.connection
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,35 @@
1
+ require 'mv/core/validation/base'
2
+
3
+ module Mv
4
+ module Core
5
+ module Validation
6
+ class Absence < Base
7
+ include ActiveModel::Validations
8
+
9
+ validate :nil_and_blank_can_not_be_both_denied
10
+
11
+ def initialize(table_name, column_name, opts)
12
+ super(table_name, column_name, opts)
13
+ end
14
+
15
+ protected
16
+
17
+ def default_allow_nil
18
+ true
19
+ end
20
+
21
+ def default_allow_blank
22
+ true
23
+ end
24
+
25
+ private
26
+
27
+ def nil_and_blank_can_not_be_both_denied
28
+ if !(allow_blank || allow_nil)
29
+ errors.add(:allow_blank, 'can not be denied when nil is denied')
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end