dynamic_migrations 3.8.7 → 3.8.8
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/lib/dynamic_migrations/active_record/migrators/validation.rb +2 -20
- data/lib/dynamic_migrations/postgres/generator/fragment.rb +9 -2
- data/lib/dynamic_migrations/postgres/generator/validation.rb +1 -3
- data/lib/dynamic_migrations/postgres/generator/validation_template_base.rb +1 -7
- data/lib/dynamic_migrations/postgres/server/database/differences.rb +8 -3
- data/lib/dynamic_migrations/postgres/server/database/keys_and_unique_constraints_loader.rb +2 -2
- data/lib/dynamic_migrations/postgres/server/database/loaded_schemas_builder.rb +1 -1
- data/lib/dynamic_migrations/postgres/server/database/schema/enum.rb +2 -2
- data/lib/dynamic_migrations/postgres/server/database/schema/function.rb +2 -2
- data/lib/dynamic_migrations/postgres/server/database/schema/table/column.rb +6 -2
- data/lib/dynamic_migrations/postgres/server/database/schema/table/columns.rb +0 -6
- data/lib/dynamic_migrations/postgres/server/database/schema/table/foreign_key_constraint.rb +6 -2
- data/lib/dynamic_migrations/postgres/server/database/schema/table/index.rb +7 -3
- data/lib/dynamic_migrations/postgres/server/database/schema/table/primary_key.rb +6 -2
- data/lib/dynamic_migrations/postgres/server/database/schema/table/trigger.rb +10 -8
- data/lib/dynamic_migrations/postgres/server/database/schema/table/triggers.rb +2 -2
- data/lib/dynamic_migrations/postgres/server/database/schema/table/unique_constraint.rb +6 -2
- data/lib/dynamic_migrations/postgres/server/database/schema/table/validation.rb +12 -19
- data/lib/dynamic_migrations/postgres/server/database/schema/table.rb +1 -1
- data/lib/dynamic_migrations/postgres/server/database/validations_loader.rb +1 -3
- data/lib/dynamic_migrations/version.rb +1 -1
- data/sig/dynamic_migrations/active_record/migrators/validation.rbs +1 -1
- data/sig/dynamic_migrations/postgres/generator/fragment.rbs +3 -0
- data/sig/dynamic_migrations/postgres/generator/validation_template_base.rbs +0 -1
- data/sig/dynamic_migrations/postgres/server/database/schema/table/column.rbs +3 -0
- data/sig/dynamic_migrations/postgres/server/database/schema/table/foreign_key_constraint.rbs +3 -0
- data/sig/dynamic_migrations/postgres/server/database/schema/table/index.rbs +3 -0
- data/sig/dynamic_migrations/postgres/server/database/schema/table/primary_key.rbs +3 -0
- data/sig/dynamic_migrations/postgres/server/database/schema/table/trigger.rbs +3 -0
- data/sig/dynamic_migrations/postgres/server/database/schema/table/unique_constraint.rbs +3 -0
- data/sig/dynamic_migrations/postgres/server/database/schema/table/validation.rbs +4 -3
- metadata +2 -3
- data/lib/dynamic_migrations/name_helper.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d822c8e95efe29d0f03f07162f27909ba4222ab4be98c421d64bd167fe923443
|
4
|
+
data.tar.gz: 88a20111dae2a34872d0759f47a0c8c29eab87d354ebb7a55d33152c9d06c6e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2210081126891f62ebadb6dd9f9f53cafd5cdd7ae196558b00e94ffdf91b64b1686d65c95ec07357ee8043ba1e8c698812ed07503d8b46287ab5496e26beb46d
|
7
|
+
data.tar.gz: eb23900019d373320e0f2510eadd2714c1c2c4324af0b0a4f68886754204deb7ebc0de11f833bf43b0a53b38f80448b70370ccd57ca55005c97715c397f4b579
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [3.8.8](https://github.com/craigulliott/dynamic_migrations/compare/v3.8.7...v3.8.8) (2023-10-11)
|
4
|
+
|
5
|
+
|
6
|
+
### Bug Fixes
|
7
|
+
|
8
|
+
* adding a specific error type for invalid names ([12df7bd](https://github.com/craigulliott/dynamic_migrations/commit/12df7bddcb947d3ab5b1b00eebefdda0a3ce15ac))
|
9
|
+
* fixed bug where check_clause and action_condition were being modified, also freezing strings to prevent similar bugs in the future ([dc1191b](https://github.com/craigulliott/dynamic_migrations/commit/dc1191b7e219b73da8469742259686721265a2a7))
|
10
|
+
* removed arbitrary column name sorting, as we want migrations to create columns in the order they were added ([e9a515e](https://github.com/craigulliott/dynamic_migrations/commit/e9a515eb9dbf16ef5a5e77ca0084a6514690530b))
|
11
|
+
* removing deferrable and initially deferred from check constraints because postgres doesn't support them ([945aef2](https://github.com/craigulliott/dynamic_migrations/commit/945aef2419fd5f55a0551929244f3f9b0a29a905))
|
12
|
+
* should not have assumed enums in the same schema use their short name, enums are always referenced by their full name (including schema) ([a9863ba](https://github.com/craigulliott/dynamic_migrations/commit/a9863ba49727e5016c8eae74f5f2a6e7ab8c1042))
|
13
|
+
* we were not resolving the correct deferred and initially_deferred values when loading existing database structure ([02c539a](https://github.com/craigulliott/dynamic_migrations/commit/02c539a8ea153cde6d06f6be6d8fdb0aaf851f40))
|
14
|
+
|
3
15
|
## [3.8.7](https://github.com/craigulliott/dynamic_migrations/compare/v3.8.6...v3.8.7) (2023-10-09)
|
4
16
|
|
5
17
|
|
@@ -3,7 +3,7 @@ module DynamicMigrations
|
|
3
3
|
module Migrators
|
4
4
|
module Validation
|
5
5
|
# this exists because because the standard rails migration does not support deffered constraints
|
6
|
-
def add_validation table_name, name:,
|
6
|
+
def add_validation table_name, name:, comment: nil, &block
|
7
7
|
unless block
|
8
8
|
raise MissingFunctionBlockError, "create_function requires a block"
|
9
9
|
end
|
@@ -12,28 +12,10 @@ module DynamicMigrations
|
|
12
12
|
sql = block.call.strip
|
13
13
|
end
|
14
14
|
|
15
|
-
if initially_deferred == true && deferrable == false
|
16
|
-
raise DeferrableOptionsError, "A constraint can only be initially deferred if it is also deferrable"
|
17
|
-
end
|
18
|
-
|
19
|
-
# allow it to be deferred, and defer it by default
|
20
|
-
deferrable_sql = if initially_deferred
|
21
|
-
"DEFERRABLE INITIALLY DEFERRED"
|
22
|
-
|
23
|
-
# allow it to be deferred, but do not deferr by default
|
24
|
-
elsif deferrable
|
25
|
-
"DEFERRABLE INITIALLY IMMEDIATE"
|
26
|
-
|
27
|
-
# it can not be deferred (this is the default)
|
28
|
-
else
|
29
|
-
"NOT DEFERRABLE"
|
30
|
-
end
|
31
|
-
|
32
15
|
execute <<~SQL
|
33
16
|
ALTER TABLE #{table_name}
|
34
17
|
ADD CONSTRAINT #{name}
|
35
|
-
CHECK (#{sql})
|
36
|
-
#{deferrable_sql};
|
18
|
+
CHECK (#{sql});
|
37
19
|
SQL
|
38
20
|
|
39
21
|
if comment.is_a? String
|
@@ -5,6 +5,9 @@ module DynamicMigrations
|
|
5
5
|
class InvalidNameError < StandardError
|
6
6
|
end
|
7
7
|
|
8
|
+
class ContentRequiredError < StandardError
|
9
|
+
end
|
10
|
+
|
8
11
|
attr_reader :schema_name
|
9
12
|
attr_reader :table_name
|
10
13
|
attr_reader :migration_method
|
@@ -33,8 +36,12 @@ module DynamicMigrations
|
|
33
36
|
@object_name = object_name
|
34
37
|
|
35
38
|
@migration_method = migration_method
|
36
|
-
@code_comment = code_comment
|
37
|
-
|
39
|
+
@code_comment = code_comment&.freeze
|
40
|
+
|
41
|
+
if content.nil?
|
42
|
+
raise ContentRequiredError, "Content is required for a fragment"
|
43
|
+
end
|
44
|
+
@content = content.freeze
|
38
45
|
end
|
39
46
|
|
40
47
|
# Returns a string representation of the fragment for use in the final
|
@@ -10,17 +10,11 @@ module DynamicMigrations
|
|
10
10
|
|
11
11
|
def initialize validation, code_comment
|
12
12
|
@validation = validation
|
13
|
-
@code_comment = code_comment
|
13
|
+
@code_comment = code_comment&.freeze
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
def assert_not_deferred!
|
19
|
-
if @validation.initially_deferred || @validation.deferrable
|
20
|
-
raise TemplateError, "#{self.class.name} validation template requires constraints to be are not deferrable"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
18
|
def assert_column_count! count = 1
|
25
19
|
if @validation.columns.count != count
|
26
20
|
raise TemplateError, "#{self.class.name} validation template requires a validation with only #{count} column"
|
@@ -367,9 +367,7 @@ module DynamicMigrations
|
|
367
367
|
result[name] = compare_record validation, comparison_validations[name], [
|
368
368
|
:normalized_check_clause,
|
369
369
|
:column_names,
|
370
|
-
:description
|
371
|
-
:deferrable,
|
372
|
-
:initially_deferred
|
370
|
+
:description
|
373
371
|
]
|
374
372
|
end
|
375
373
|
# look for any validations in the comparison list which were not in the base list
|
@@ -435,6 +433,13 @@ module DynamicMigrations
|
|
435
433
|
log.debug " Comparing `#{method_name}`"
|
436
434
|
|
437
435
|
matches = (comparison && comparison.send(method_name) == base.send(method_name)) || false
|
436
|
+
|
437
|
+
unless matches
|
438
|
+
log.debug " Values are different"
|
439
|
+
log.debug " Base Value: `#{base.send(method_name)}`"
|
440
|
+
log.debug " Other Value: `#{comparison.nil? ? "nil" : comparison.send(method_name)}`"
|
441
|
+
end
|
442
|
+
|
438
443
|
result[method_name] = {
|
439
444
|
value: base.send(method_name),
|
440
445
|
matches: matches
|
@@ -152,8 +152,8 @@ module DynamicMigrations
|
|
152
152
|
on_delete = nil
|
153
153
|
end
|
154
154
|
|
155
|
-
deferrable = row["deferrable"] == "
|
156
|
-
initially_deferred = row["initially_deferred"] == "
|
155
|
+
deferrable = row["deferrable"] == "t"
|
156
|
+
initially_deferred = row["initially_deferred"] == "t"
|
157
157
|
|
158
158
|
index_type = if row["index_type"].nil?
|
159
159
|
nil
|
@@ -60,7 +60,7 @@ module DynamicMigrations
|
|
60
60
|
|
61
61
|
# add any validations
|
62
62
|
table_validations&.each do |validation_name, validation_definition|
|
63
|
-
table.add_validation validation_name, validation_definition[:columns], validation_definition[:check_clause], description: validation_definition[:description]
|
63
|
+
table.add_validation validation_name, validation_definition[:columns], validation_definition[:check_clause], description: validation_definition[:description]
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
@@ -50,7 +50,7 @@ module DynamicMigrations
|
|
50
50
|
|
51
51
|
unless description.nil?
|
52
52
|
raise ExpectedStringError, description unless description.is_a? String
|
53
|
-
@description = description.strip
|
53
|
+
@description = description.strip.freeze
|
54
54
|
@description = nil if description == ""
|
55
55
|
end
|
56
56
|
end
|
@@ -68,7 +68,7 @@ module DynamicMigrations
|
|
68
68
|
raise EnumValueTooLongError, "Value `#{value}` must be less than 64 characters"
|
69
69
|
end
|
70
70
|
|
71
|
-
@values << value
|
71
|
+
@values << value.freeze
|
72
72
|
end
|
73
73
|
|
74
74
|
# returns true if this enum has a description, otehrwise false
|
@@ -37,11 +37,11 @@ module DynamicMigrations
|
|
37
37
|
unless definition.is_a?(String) && definition.strip != "" && definition.strip.end_with?("END;", "END")
|
38
38
|
raise ExpectedDefinitionError, "Definition must be a string, and end with `END;`. Definition provided:\n#{definition}"
|
39
39
|
end
|
40
|
-
@definition = definition.strip
|
40
|
+
@definition = definition.strip.freeze
|
41
41
|
|
42
42
|
unless description.nil?
|
43
43
|
raise ExpectedStringError, description unless description.is_a? String
|
44
|
-
@description = description.strip
|
44
|
+
@description = description.strip.freeze
|
45
45
|
@description = nil if description == ""
|
46
46
|
end
|
47
47
|
end
|
@@ -14,6 +14,9 @@ module DynamicMigrations
|
|
14
14
|
class UnexpectedEnumError < StandardError
|
15
15
|
end
|
16
16
|
|
17
|
+
class InvalidNameError < StandardError
|
18
|
+
end
|
19
|
+
|
17
20
|
attr_reader :table
|
18
21
|
attr_reader :name
|
19
22
|
attr_reader :data_type
|
@@ -29,7 +32,8 @@ module DynamicMigrations
|
|
29
32
|
raise ExpectedTableError, table unless table.is_a? Table
|
30
33
|
@table = table
|
31
34
|
|
32
|
-
raise
|
35
|
+
raise InvalidNameError, "Unexpected name `#{name}`. Name should be a Symbol" unless name.is_a? Symbol
|
36
|
+
raise InvalidNameError, "The name `#{name}` is too long. Names must be less than 64 characters" unless name.length < 64
|
33
37
|
@name = name
|
34
38
|
|
35
39
|
raise ExpectedSymbolError, data_type unless data_type.is_a? Symbol
|
@@ -44,7 +48,7 @@ module DynamicMigrations
|
|
44
48
|
|
45
49
|
unless description.nil?
|
46
50
|
raise ExpectedStringError, description unless description.is_a? String
|
47
|
-
@description = description.strip
|
51
|
+
@description = description.strip.freeze
|
48
52
|
@description = nil if description == ""
|
49
53
|
end
|
50
54
|
|
@@ -50,12 +50,6 @@ module DynamicMigrations
|
|
50
50
|
else
|
51
51
|
raise ModuleIncludedIntoUnexpectedTargetError, included_target
|
52
52
|
end
|
53
|
-
# sort the hash so that the columns are in alphabetical order by name
|
54
|
-
sorted_columns = {}
|
55
|
-
@columns.keys.sort.each do |name|
|
56
|
-
sorted_columns[name] = @columns[name]
|
57
|
-
end
|
58
|
-
@columns = sorted_columns
|
59
53
|
# return the new column
|
60
54
|
new_column
|
61
55
|
end
|
@@ -20,6 +20,9 @@ module DynamicMigrations
|
|
20
20
|
class UnexpectedReferentialActionError < StandardError
|
21
21
|
end
|
22
22
|
|
23
|
+
class InvalidNameError < StandardError
|
24
|
+
end
|
25
|
+
|
23
26
|
attr_reader :table
|
24
27
|
attr_reader :foreign_table
|
25
28
|
attr_reader :name
|
@@ -64,12 +67,13 @@ module DynamicMigrations
|
|
64
67
|
add_column column, true
|
65
68
|
end
|
66
69
|
|
67
|
-
raise
|
70
|
+
raise InvalidNameError, "Unexpected name `#{name}`. Name should be a Symbol" unless name.is_a? Symbol
|
71
|
+
raise InvalidNameError, "The name `#{name}` is too long. Names must be less than 64 characters" unless name.length < 64
|
68
72
|
@name = name
|
69
73
|
|
70
74
|
unless description.nil?
|
71
75
|
raise ExpectedStringError, description unless description.is_a? String
|
72
|
-
@description = description.strip
|
76
|
+
@description = description.strip.freeze
|
73
77
|
@description = nil if description == ""
|
74
78
|
end
|
75
79
|
|
@@ -30,6 +30,9 @@ module DynamicMigrations
|
|
30
30
|
class DuplicateColumnError < StandardError
|
31
31
|
end
|
32
32
|
|
33
|
+
class InvalidNameError < StandardError
|
34
|
+
end
|
35
|
+
|
33
36
|
attr_reader :table
|
34
37
|
attr_reader :name
|
35
38
|
attr_reader :unique
|
@@ -56,12 +59,13 @@ module DynamicMigrations
|
|
56
59
|
add_column column
|
57
60
|
end
|
58
61
|
|
59
|
-
raise
|
62
|
+
raise InvalidNameError, "Unexpected name `#{name}`. Name should be a Symbol" unless name.is_a? Symbol
|
63
|
+
raise InvalidNameError, "The name `#{name}` is too long. Names must be less than 64 characters" unless name.length < 64
|
60
64
|
@name = name
|
61
65
|
|
62
66
|
unless description.nil?
|
63
67
|
raise ExpectedStringError, description unless description.is_a? String
|
64
|
-
@description = description.strip
|
68
|
+
@description = description.strip.freeze
|
65
69
|
@description = nil if description == ""
|
66
70
|
end
|
67
71
|
|
@@ -70,7 +74,7 @@ module DynamicMigrations
|
|
70
74
|
|
71
75
|
unless where.nil?
|
72
76
|
raise ExpectedStringError, where unless where.is_a? String
|
73
|
-
@where = where
|
77
|
+
@where = where.freeze
|
74
78
|
end
|
75
79
|
|
76
80
|
raise UnexpectedIndexTypeError, type unless INDEX_TYPES.include?(type)
|
@@ -20,6 +20,9 @@ module DynamicMigrations
|
|
20
20
|
class DuplicateColumnError < StandardError
|
21
21
|
end
|
22
22
|
|
23
|
+
class InvalidNameError < StandardError
|
24
|
+
end
|
25
|
+
|
23
26
|
attr_reader :table
|
24
27
|
attr_reader :name
|
25
28
|
attr_reader :description
|
@@ -40,12 +43,13 @@ module DynamicMigrations
|
|
40
43
|
add_column column
|
41
44
|
end
|
42
45
|
|
43
|
-
raise
|
46
|
+
raise InvalidNameError, "Unexpected name `#{name}`. Name should be a Symbol" unless name.is_a? Symbol
|
47
|
+
raise InvalidNameError, "The name `#{name}` is too long. Names must be less than 64 characters" unless name.length < 64
|
44
48
|
@name = name
|
45
49
|
|
46
50
|
unless description.nil?
|
47
51
|
raise ExpectedStringError, description unless description.is_a? String
|
48
|
-
@description = description.strip
|
52
|
+
@description = description.strip.freeze
|
49
53
|
@description = nil if description == ""
|
50
54
|
end
|
51
55
|
end
|
@@ -41,6 +41,9 @@ module DynamicMigrations
|
|
41
41
|
class UnnormalizableActionConditionError < StandardError
|
42
42
|
end
|
43
43
|
|
44
|
+
class InvalidNameError < StandardError
|
45
|
+
end
|
46
|
+
|
44
47
|
attr_reader :table
|
45
48
|
attr_reader :name
|
46
49
|
attr_reader :event_manipulation
|
@@ -63,9 +66,8 @@ module DynamicMigrations
|
|
63
66
|
end
|
64
67
|
@table = table
|
65
68
|
|
66
|
-
unless name.is_a? Symbol
|
67
|
-
|
68
|
-
end
|
69
|
+
raise InvalidNameError, "Unexpected name `#{name}`. Name should be a Symbol" unless name.is_a? Symbol
|
70
|
+
raise InvalidNameError, "The name `#{name}` is too long. Names must be less than 64 characters" unless name.length < 64
|
69
71
|
@name = name
|
70
72
|
|
71
73
|
unless [:before, :after].include? action_timing
|
@@ -93,12 +95,12 @@ module DynamicMigrations
|
|
93
95
|
unless action_condition.nil? || action_condition.is_a?(String)
|
94
96
|
raise ExpectedStringError, action_condition
|
95
97
|
end
|
96
|
-
@action_condition = action_condition&.strip
|
98
|
+
@action_condition = action_condition&.strip&.freeze
|
97
99
|
|
98
100
|
unless parameters.is_a?(Array) && parameters.all? { |p| p.is_a? String }
|
99
101
|
raise UnexpectedParametersError, "unexpected parameters `#{parameters}`, currently only an array of strings is supported"
|
100
102
|
end
|
101
|
-
@parameters = parameters
|
103
|
+
@parameters = parameters.map(&:freeze)
|
102
104
|
|
103
105
|
unless [:row, :statement].include? action_orientation
|
104
106
|
raise UnexpectedActionOrientationError, action_orientation
|
@@ -128,7 +130,7 @@ module DynamicMigrations
|
|
128
130
|
|
129
131
|
unless description.nil?
|
130
132
|
raise ExpectedStringError, description unless description.is_a? String
|
131
|
-
@description = description.strip
|
133
|
+
@description = description.strip.freeze
|
132
134
|
@description = nil if description == ""
|
133
135
|
end
|
134
136
|
|
@@ -166,7 +168,7 @@ module DynamicMigrations
|
|
166
168
|
unless new_action_condition.nil? || new_action_condition.is_a?(String)
|
167
169
|
raise ExpectedStringError, new_action_condition
|
168
170
|
end
|
169
|
-
@action_condition = new_action_condition&.strip
|
171
|
+
@action_condition = new_action_condition&.strip&.freeze
|
170
172
|
end
|
171
173
|
|
172
174
|
def add_parameter new_parameter
|
@@ -224,7 +226,7 @@ module DynamicMigrations
|
|
224
226
|
$$ BEGIN END $$;
|
225
227
|
SQL
|
226
228
|
|
227
|
-
temp_action_condition = action_condition
|
229
|
+
temp_action_condition = action_condition.dup
|
228
230
|
# string replace any real enum names with their temp enum names
|
229
231
|
temp_enums.each do |temp_enum_name, enum|
|
230
232
|
temp_action_condition.gsub!("::#{enum.name}", "::#{temp_enum_name}")
|
@@ -17,14 +17,14 @@ module DynamicMigrations
|
|
17
17
|
# returns the trigger object for the provided trigger name, and raises an
|
18
18
|
# error if the trigger does not exist
|
19
19
|
def trigger name
|
20
|
-
raise
|
20
|
+
raise Trigger::InvalidNameError, name unless name.is_a? Symbol
|
21
21
|
raise TriggerDoesNotExistError unless has_trigger? name
|
22
22
|
@triggers[name]
|
23
23
|
end
|
24
24
|
|
25
25
|
# returns true if this table has a trigger with the provided name, otherwise false
|
26
26
|
def has_trigger? name
|
27
|
-
raise
|
27
|
+
raise Trigger::InvalidNameError, name unless name.is_a? Symbol
|
28
28
|
@triggers.key? name
|
29
29
|
end
|
30
30
|
|
@@ -23,6 +23,9 @@ module DynamicMigrations
|
|
23
23
|
class DuplicateColumnError < StandardError
|
24
24
|
end
|
25
25
|
|
26
|
+
class InvalidNameError < StandardError
|
27
|
+
end
|
28
|
+
|
26
29
|
attr_reader :table
|
27
30
|
attr_reader :name
|
28
31
|
attr_reader :deferrable
|
@@ -45,12 +48,13 @@ module DynamicMigrations
|
|
45
48
|
add_column column
|
46
49
|
end
|
47
50
|
|
48
|
-
raise
|
51
|
+
raise InvalidNameError, "Unexpected name `#{name}`. Name should be a Symbol" unless name.is_a? Symbol
|
52
|
+
raise InvalidNameError, "The name `#{name}` is too long. Names must be less than 64 characters" unless name.length < 64
|
49
53
|
@name = name
|
50
54
|
|
51
55
|
unless description.nil?
|
52
56
|
raise ExpectedStringError, description unless description.is_a? String
|
53
|
-
@description = description.strip
|
57
|
+
@description = description.strip.freeze
|
54
58
|
@description = nil if description == ""
|
55
59
|
end
|
56
60
|
|
@@ -26,25 +26,27 @@ module DynamicMigrations
|
|
26
26
|
class UnnormalizableCheckClauseError < StandardError
|
27
27
|
end
|
28
28
|
|
29
|
+
class InvalidNameError < StandardError
|
30
|
+
end
|
31
|
+
|
29
32
|
attr_reader :table
|
30
33
|
attr_reader :name
|
31
34
|
attr_reader :check_clause
|
32
|
-
attr_reader :deferrable
|
33
|
-
attr_reader :initially_deferred
|
34
35
|
attr_reader :description
|
35
36
|
attr_reader :template
|
36
37
|
|
37
38
|
# initialize a new object to represent a validation in a postgres table
|
38
|
-
def initialize source, table, columns, name, check_clause, description: nil,
|
39
|
+
def initialize source, table, columns, name, check_clause, description: nil, template: nil
|
39
40
|
super source
|
40
41
|
raise ExpectedTableError, table unless table.is_a? Table
|
41
42
|
@table = table
|
42
43
|
|
43
|
-
raise
|
44
|
+
raise InvalidNameError, "Unexpected name `#{name}`. Name should be a Symbol" unless name.is_a? Symbol
|
45
|
+
raise InvalidNameError, "The name `#{name}` is too long. Names must be less than 64 characters" unless name.length < 64
|
44
46
|
@name = name
|
45
47
|
|
46
48
|
raise ExpectedStringError, check_clause unless check_clause.is_a? String
|
47
|
-
@check_clause = check_clause.strip
|
49
|
+
@check_clause = check_clause.strip.freeze
|
48
50
|
|
49
51
|
# if this validation is created via configuration (apposed to being loaded) then they can be lazy loaded
|
50
52
|
unless from_configuration? && columns.nil?
|
@@ -61,16 +63,10 @@ module DynamicMigrations
|
|
61
63
|
|
62
64
|
unless description.nil?
|
63
65
|
raise ExpectedStringError, description unless description.is_a? String
|
64
|
-
@description = description.strip
|
66
|
+
@description = description.strip.freeze
|
65
67
|
@description = nil if description == ""
|
66
68
|
end
|
67
69
|
|
68
|
-
raise ExpectedBooleanError, deferrable unless [true, false].include?(deferrable)
|
69
|
-
@deferrable = deferrable
|
70
|
-
|
71
|
-
raise ExpectedBooleanError, initially_deferred unless [true, false].include?(initially_deferred)
|
72
|
-
@initially_deferred = initially_deferred
|
73
|
-
|
74
70
|
unless template.nil?
|
75
71
|
unless Generator::Validation.has_template? template
|
76
72
|
raise UnexpectedTemplateError, "Unrecognised template #{template}"
|
@@ -96,14 +92,12 @@ module DynamicMigrations
|
|
96
92
|
end
|
97
93
|
|
98
94
|
def column_names
|
99
|
-
columns.map(&:name)
|
95
|
+
columns.map(&:name).sort
|
100
96
|
end
|
101
97
|
|
102
98
|
def differences_descriptions other_validation
|
103
99
|
method_differences_descriptions other_validation, [
|
104
|
-
:normalized_check_clause
|
105
|
-
:deferrable,
|
106
|
-
:initially_deferred
|
100
|
+
:normalized_check_clause
|
107
101
|
]
|
108
102
|
end
|
109
103
|
|
@@ -134,7 +128,7 @@ module DynamicMigrations
|
|
134
128
|
|
135
129
|
temp_enums = table.create_temp_table(connection, "validation_normalized_check_clause_temp_table")
|
136
130
|
|
137
|
-
temp_check_clause = check_clause
|
131
|
+
temp_check_clause = check_clause.dup
|
138
132
|
# string replace any real enum names with their temp enum names
|
139
133
|
temp_enums.each do |temp_enum_name, enum|
|
140
134
|
temp_check_clause.gsub!("::#{enum.name}", "::#{temp_enum_name}")
|
@@ -182,8 +176,7 @@ module DynamicMigrations
|
|
182
176
|
|
183
177
|
# string replace any enum names with their real enum names
|
184
178
|
temp_enums.each do |temp_enum_name, enum|
|
185
|
-
|
186
|
-
check_clause_result.gsub!("::#{temp_enum_name}", "::#{real_enum_name}")
|
179
|
+
check_clause_result.gsub!("::#{temp_enum_name}", "::#{enum.full_name}")
|
187
180
|
end
|
188
181
|
|
189
182
|
column_names_result = column_names_string.gsub(/\A\{/, "").gsub(/\}\Z/, "").split(",").map { |column_name| column_name.to_sym }
|
@@ -43,7 +43,7 @@ module DynamicMigrations
|
|
43
43
|
|
44
44
|
unless description.nil?
|
45
45
|
raise ExpectedStringError, description unless description.is_a? String
|
46
|
-
@description = description.strip
|
46
|
+
@description = description.strip.freeze
|
47
47
|
@description = nil if description == ""
|
48
48
|
end
|
49
49
|
|
@@ -86,9 +86,7 @@ module DynamicMigrations
|
|
86
86
|
table[validation_name] = {
|
87
87
|
columns: row["columns"].gsub(/\A\{/, "").gsub(/\}\Z/, "").split(",").map { |column_name| column_name.to_sym },
|
88
88
|
check_clause: check_clause,
|
89
|
-
description: row["description"]
|
90
|
-
deferrable: row["deferrable"] == "TRUE",
|
91
|
-
initially_deferred: row["initially_deferred"] == "TRUE"
|
89
|
+
description: row["description"]
|
92
90
|
}
|
93
91
|
end
|
94
92
|
schemas
|
@@ -5,7 +5,7 @@ module DynamicMigrations
|
|
5
5
|
module ActiveRecord
|
6
6
|
module Migrators
|
7
7
|
module Validation
|
8
|
-
def add_validation: (Symbol table_name, name: Symbol, ?
|
8
|
+
def add_validation: (Symbol table_name, name: Symbol, ?comment: String?) -> void
|
9
9
|
def remove_validation: (Symbol table_name, Symbol name) -> void
|
10
10
|
def set_validation_comment: (Symbol table_name, Symbol validation_name, String comment) -> void
|
11
11
|
def remove_validation_comment: (Symbol table_name, Symbol validation_name) -> void
|
@@ -15,7 +15,6 @@ module DynamicMigrations
|
|
15
15
|
def fragment_arguments: -> {schema: Postgres::Server::Database::Schema, table: Postgres::Server::Database::Schema::Table, migration_method: Symbol, object: untyped, code_comment: String?, migration: String, dependent_function: Postgres::Server::Database::Schema::Function?}
|
16
16
|
|
17
17
|
private
|
18
|
-
def assert_not_deferred!: -> void
|
19
18
|
def assert_column_count!: (?Integer count) -> void
|
20
19
|
def first_column: -> Postgres::Server::Database::Schema::Table::Column
|
21
20
|
def value_from_check_clause: (Regexp regex) -> untyped
|
@@ -11,12 +11,10 @@ module DynamicMigrations
|
|
11
11
|
attr_reader table: Table
|
12
12
|
attr_reader name: Symbol
|
13
13
|
attr_reader check_clause: String
|
14
|
-
attr_reader deferrable: bool
|
15
|
-
attr_reader initially_deferred: bool
|
16
14
|
attr_reader description: String?
|
17
15
|
attr_reader template: Symbol?
|
18
16
|
|
19
|
-
def initialize: (database_or_configuration source, Table table, Array[Column]? columns, Symbol name, String check_clause, ?
|
17
|
+
def initialize: (database_or_configuration source, Table table, Array[Column]? columns, Symbol name, String check_clause, ?description: String?, ?template: Symbol?) -> void
|
20
18
|
def columns: -> Array[Column]
|
21
19
|
def column_names: -> Array[Symbol]
|
22
20
|
def has_description?: -> bool
|
@@ -50,6 +48,9 @@ module DynamicMigrations
|
|
50
48
|
|
51
49
|
class UnnormalizableCheckClauseError < StandardError
|
52
50
|
end
|
51
|
+
|
52
|
+
class InvalidNameError < StandardError
|
53
|
+
end
|
53
54
|
end
|
54
55
|
end
|
55
56
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamic_migrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.8.
|
4
|
+
version: 3.8.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Craig Ulliott
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -96,7 +96,6 @@ files:
|
|
96
96
|
- lib/dynamic_migrations/expected_symbol_error.rb
|
97
97
|
- lib/dynamic_migrations/invalid_source_error.rb
|
98
98
|
- lib/dynamic_migrations/module_included_into_unexpected_target_error.rb
|
99
|
-
- lib/dynamic_migrations/name_helper.rb
|
100
99
|
- lib/dynamic_migrations/postgres.rb
|
101
100
|
- lib/dynamic_migrations/postgres/connections.rb
|
102
101
|
- lib/dynamic_migrations/postgres/generator.rb
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module DynamicMigrations
|
2
|
-
module NameHelper
|
3
|
-
# shortens a table name like 'invoice_subscription_prepayments' to 'inv_sub_pre'
|
4
|
-
warn "no unit tests"
|
5
|
-
def abbreviate_table_name table_name
|
6
|
-
table_name_without_schema = table_name.to_s.split(".").last
|
7
|
-
if table_name_without_schema.nil?
|
8
|
-
raise "no table name provided"
|
9
|
-
end
|
10
|
-
table_name_without_schema.split("_").map { |v| v[0..2] }.join("_")
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|