mv-core 1.0.1 → 2.0.0

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.
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
@@ -1,29 +0,0 @@
1
- module MigrationValidators
2
- module ActiveRecord
3
- module Base
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_eval do
8
- class << self
9
- alias_method_chain :establish_connection, :validators
10
- end
11
- end
12
- end
13
-
14
- module ClassMethods
15
- def establish_connection_with_validators *args
16
- establish_connection_without_validators *args
17
-
18
- connection.class.class_eval {
19
- include MigrationValidators::ActiveRecord::ConnectionAdapters::NativeAdapter
20
- } unless connection.class.include?(MigrationValidators::ActiveRecord::ConnectionAdapters::NativeAdapter)
21
-
22
- connection.class.class_eval {
23
- include MigrationValidators::ActiveRecord::ConnectionAdapters::AbstractAdapter
24
- } unless connection.class.include?(MigrationValidators::ActiveRecord::ConnectionAdapters::AbstractAdapter)
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,38 +0,0 @@
1
- module MigrationValidators
2
- module ActiveRecord
3
- module ConnectionAdapters
4
- module AbstractAdapter
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- class_eval do
9
- alias_method_chain :initialize_schema_migrations_table, :validators
10
- end
11
- end
12
-
13
- def initialize_migration_validators_table
14
- migrations_table = MigrationValidators.migration_validators_table_name
15
-
16
- unless table_exists?(migrations_table)
17
- create_table migrations_table do |t|
18
- t.string :table_name, :null => false, :limit => 255
19
- t.string :column_name, :null => true, :limit => 255
20
- t.string :validator_name, :null => false, :limit => 255
21
- t.text :options#, default: {}.to_yaml
22
- t.text :constraints#, default: [].to_yaml
23
- end
24
-
25
- add_index migrations_table, :table_name
26
- add_index migrations_table, [:table_name, :column_name], :name => 'mg_vld_tbl_clm'
27
- add_index migrations_table, [:table_name, :column_name, :validator_name], :name => 'mg_vld_tbl_clm_vldn', :unique => true
28
- end
29
- end
30
-
31
- def initialize_schema_migrations_table_with_validators
32
- initialize_schema_migrations_table_without_validators
33
- initialize_migration_validators_table
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,129 +0,0 @@
1
- # DbValidator = MigrationValidators::Core::DbValidator
2
-
3
- module MigrationValidators
4
- module ActiveRecord
5
- module ConnectionAdapters
6
- module NativeAdapter
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- class_eval do
11
- alias_method_chain :drop_table, :validators
12
- alias_method_chain :remove_column, :validators
13
- alias_method_chain :rename_column, :validators
14
- alias_method_chain :change_column, :validators
15
- alias_method_chain :add_column, :validators
16
- alias_method_chain :rename_table, :validators
17
- alias_method_chain :create_table, :validators
18
- end
19
- end
20
-
21
- def validate_column table_name, column_name, opts
22
- table_name = table_name || @context_table_name
23
- raise MigrationValidatorsException.new("at least one column validator should be defined") if opts.blank?
24
-
25
-
26
- opts.each do |validator_name, validator_options|
27
- if validator_options.blank?
28
- raise MigrationValidatorsException.new("use false to remove column validator") unless validator_options == false
29
-
30
- MigrationValidators::Core::DbValidator.on_table(table_name)
31
- .on_column(column_name)
32
- .with_name(validator_name)
33
- .delayed_destroy
34
- else
35
- validator_options = {} if validator_options == true
36
- MigrationValidators::Core::DbValidator.new(table_name: table_name,
37
- column_name: column_name,
38
- validator_name: validator_name,
39
- options: validator_options).delayed_save
40
- end
41
- end
42
- end
43
-
44
- def in_context_of_table table_name
45
- @context_table_name = table_name
46
- res = yield if block_given?
47
- @context_table_name = nil
48
- res
49
- end
50
-
51
- def do_internally
52
- disable_migration_validators
53
- yield
54
- enable_migration_validators
55
- end
56
-
57
- private
58
-
59
- def disable_migration_validators
60
- @migration_validators_call_stack = [0, @migration_validators_call_stack ||= 0].max + 1
61
- end
62
-
63
- def enable_migration_validators
64
- @migration_validators_call_stack = [0, @migration_validators_call_stack ||= 0].max - 1
65
- end
66
-
67
- def migration_validators_enabled
68
- (@migration_validators_call_stack ||= 0) <= 0
69
- end
70
-
71
-
72
- def do_enabled
73
- yield if migration_validators_enabled
74
- end
75
-
76
-
77
- def drop_table_with_validators table_name
78
- do_enabled { MigrationValidators::Core::DbValidator.on_table(table_name).delayed_destroy }
79
- do_internally { drop_table_without_validators table_name }
80
- end
81
-
82
- def remove_column_with_validators table_name, *column_names
83
- do_enabled do
84
- column_names.flatten.each do |column_name|
85
- # MigrationValidators::Core::DbValidator.remove_column_validators table_name, column_name
86
- MigrationValidators::Core::DbValidator.on_table(table_name).on_column(column_name).delayed_destroy
87
- end
88
- end
89
-
90
- do_internally { remove_column_without_validators table_name, *column_names }
91
- end
92
-
93
- def rename_column_with_validators table_name, old_column_name, new_column_name
94
- do_enabled { MigrationValidators::Core::DbValidator.rename_column table_name, old_column_name, new_column_name }
95
- do_internally { rename_column_without_validators table_name, old_column_name, new_column_name }
96
- end
97
-
98
- def add_column_with_validators table_name, column_name, type, opts
99
- validates = opts.delete(:validates)
100
-
101
- do_internally { add_column_without_validators table_name, column_name, type, opts }
102
-
103
- do_enabled { validate_column(table_name, column_name, validates) } unless validates.blank?
104
- end
105
-
106
- def rename_table_with_validators old_table_name, new_table_name
107
- do_enabled { MigrationValidators::Core::DbValidator.rename_table old_table_name, new_table_name }
108
- do_internally { rename_table_without_validators old_table_name, new_table_name }
109
- end
110
-
111
- def change_column_with_validators table_name, column_name, type, opts
112
- validates = opts.delete(:validates)
113
-
114
- do_enabled { MigrationValidators::Core::DbValidator.on_table(table_name).on_column(column_name).delayed_destroy }
115
-
116
- do_internally { change_column_without_validators table_name, column_name, type, opts }
117
-
118
- do_enabled { validate_column(table_name, column_name, validates) } unless validates.blank?
119
- end
120
-
121
- def create_table_with_validators table_name, *args, &block
122
- in_context_of_table table_name do
123
- create_table_without_validators table_name, *args, &block
124
- end
125
- end
126
- end
127
- end
128
- end
129
- end
@@ -1,17 +0,0 @@
1
- module MigrationValidators
2
- module ActiveRecord
3
- module ConnectionAdapters
4
- module Table
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- class_eval do
9
- def change_validates column_name, opts
10
- ::ActiveRecord::Base.connection.validate_column(@table_name, column_name, opts) unless opts.blank?
11
- end
12
- end
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,33 +0,0 @@
1
- module MigrationValidators
2
- module ActiveRecord
3
- module ConnectionAdapters
4
- module TableDefinition
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- class_eval do
9
- alias_method_chain :column, :validators
10
-
11
- def change_validates *args
12
- end
13
- end
14
- end
15
-
16
- def column_with_validators name, type, options = {}
17
- validates = options.delete(:validates)
18
-
19
- column_without_validators name, type, options
20
-
21
- #ugly patch
22
- connection = ::ActiveRecord::Base.connection
23
-
24
- connection.class.class_eval {
25
- include MigrationValidators::ActiveRecord::ConnectionAdapters::NativeAdapter
26
- } unless connection.class.include?(MigrationValidators::ActiveRecord::ConnectionAdapters::NativeAdapter)
27
-
28
- connection.validate_column(nil, name, validates) unless validates.blank?
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,25 +0,0 @@
1
- module MigrationValidators
2
- module ActiveRecord
3
- module Migration
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_eval do
8
- alias_method_chain :exec_migration, :validators
9
- end
10
- end
11
-
12
- def exec_migration_with_validators *args
13
- connection.class.class_eval {
14
- include MigrationValidators::ActiveRecord::ConnectionAdapters::NativeAdapter
15
- } unless connection.class.include?(MigrationValidators::ActiveRecord::ConnectionAdapters::NativeAdapter)
16
-
17
- connection.initialize_migration_validators_table
18
-
19
- exec_migration_without_validators *args
20
-
21
- MigrationValidators::Core::DbValidator.commit MigrationValidators.validator
22
- end
23
- end
24
- end
25
- end
@@ -1,32 +0,0 @@
1
- module MigrationValidators
2
- module ActiveRecord
3
- module Schema
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_eval do
8
- class << self
9
- alias_method_chain :define, :validators
10
- end
11
- end
12
- end
13
-
14
- module ClassMethods
15
- def define_with_validators *args, &block
16
-
17
- connection.class.class_eval {
18
- include MigrationValidators::ActiveRecord::ConnectionAdapters::NativeAdapter
19
- } unless connection.class.include?(MigrationValidators::ActiveRecord::ConnectionAdapters::NativeAdapter)
20
-
21
- connection.initialize_migration_validators_table
22
-
23
- res = define_without_validators *args, &block
24
-
25
- MigrationValidators::Core::DbValidator.commit MigrationValidators.validator
26
-
27
- res
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,25 +0,0 @@
1
- module MigrationValidators
2
- module ActiveRecord
3
- module SchemaDumper
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_eval do
8
- alias_method_chain :tables, :validators
9
- end
10
- end
11
-
12
- def tables_with_validators(stream)
13
- tables_without_validators(stream)
14
-
15
- @connection.initialize_migration_validators_table
16
-
17
- stream.puts ""
18
- stream.puts " #Validators"
19
- MigrationValidators::Core::DbValidator.order([:table_name, :column_name]).each do |validator|
20
- stream.puts " validate_column :#{validator.table_name}, :#{validator.column_name}, :#{validator.validator_name} => #{validator.options.inspect}"
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,15 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__)) + '/syntax'
2
- require File.expand_path(File.dirname(__FILE__)) + '/validator_definitions'
3
- require File.expand_path(File.dirname(__FILE__)) + '/containers'
4
- require File.expand_path(File.dirname(__FILE__)) + '/routing'
5
-
6
- module MigrationValidators
7
- module Adapters
8
- class Base
9
- include MigrationValidators::Adapters::Syntax
10
- include MigrationValidators::Adapters::ValidatorDefinitions
11
- include MigrationValidators::Adapters::Containers
12
- include MigrationValidators::Adapters::Routing
13
- end
14
- end
15
- end
@@ -1,100 +0,0 @@
1
- module MigrationValidators
2
- module Adapters
3
- module Containers
4
- extend ActiveSupport::Concern
5
-
6
- module ClassMethods
7
- def containers
8
- @containers ||= {}
9
- end
10
-
11
- def container name, &block
12
- raise "Container name is not defined" if name.blank?
13
-
14
- container = containers[name] ||= MigrationValidators::Core::ValidatorContainer.new(name, validators, syntax)
15
- container.instance_eval(&block) if block
16
- container
17
- end
18
-
19
- def define_base_containers
20
- container :insert_trigger do
21
- group do |validator|
22
- [validator.table_name, (validator.options && validator.options[:insert_trigger_name]) || "trg_mgr_validates_#{validator.table_name}_ins"]
23
- end
24
-
25
- constraint_name do |group_name|
26
- group_name.last
27
- end
28
-
29
- operation :create do |stmt, trigger_name, group_name|
30
- ["CREATE TRIGGER #{trigger_name} BEFORE INSERT ON #{group_name.first} FOR EACH ROW",
31
- "BEGIN",
32
- "#{stmt}; ",
33
- "END;"].join(' ')
34
- end
35
-
36
- operation :drop do |stmt, trigger_name, group_name|
37
- "DROP TRIGGER IF EXISTS #{trigger_name};"
38
- end
39
-
40
- operation :join do |stmt, value|
41
- [stmt, value].delete_if(&:blank?).join(";\n")
42
- end
43
-
44
- operation :db_name do |value|
45
- "NEW.#{value}"
46
- end
47
-
48
- end
49
-
50
- container :update_trigger do
51
- group do |validator|
52
- [validator.table_name, (validator.options && validator.options[:update_trigger_name]) || "trg_mgr_validates_#{validator.table_name}_upd"]
53
- end
54
-
55
- constraint_name do |group_name|
56
- group_name.last
57
- end
58
-
59
- operation :create do |stmt, trigger_name, group_name|
60
- ["CREATE TRIGGER #{trigger_name} BEFORE UPDATE ON #{group_name.first} FOR EACH ROW",
61
- "BEGIN",
62
- "#{stmt}; ",
63
- "END;"].join(' ')
64
- end
65
-
66
- operation :drop do |stmt, trigger_name, group_name|
67
- "DROP TRIGGER IF EXISTS #{trigger_name};"
68
- end
69
-
70
- operation :join do |stmt, value|
71
- [stmt, value].delete_if(&:blank?).join(";\n")
72
- end
73
-
74
- operation :db_name do |value|
75
- "NEW.#{value}"
76
- end
77
- end
78
-
79
- container :check do
80
- group do |validator|
81
- [validator.table_name, (validator.options && validator.options[:check_name]) || "chk_#{validator.table_name}_#{validator.column_name}"]
82
- end
83
-
84
- constraint_name do |group_name|
85
- group_name.last
86
- end
87
-
88
- operation :create do |stmt, check_name, group_name|
89
- "ALTER TABLE #{group_name.first} ADD CONSTRAINT #{check_name} CHECK(#{stmt});"
90
- end
91
-
92
- operation :drop do |stmt, check_name, group_name|
93
- "ALTER TABLE #{group_name.first} DROP CONSTRAINT #{check_name};"
94
- end
95
- end
96
- end
97
- end
98
- end
99
- end
100
- end