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
@@ -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