dynamic_migrations 2.1.0 → 3.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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/lib/dynamic_migrations/active_record/migrators/column.rb +21 -0
  4. data/lib/dynamic_migrations/active_record/migrators/foreign_key_constraint.rb +112 -0
  5. data/lib/dynamic_migrations/active_record/migrators/function.rb +108 -0
  6. data/lib/dynamic_migrations/active_record/migrators/index.rb +27 -0
  7. data/lib/dynamic_migrations/active_record/migrators/schema.rb +21 -0
  8. data/lib/dynamic_migrations/active_record/migrators/table.rb +21 -0
  9. data/lib/dynamic_migrations/active_record/migrators/trigger.rb +109 -0
  10. data/lib/dynamic_migrations/active_record/migrators/unique_constraint.rb +63 -0
  11. data/lib/dynamic_migrations/active_record/migrators/validation.rb +67 -0
  12. data/lib/dynamic_migrations/active_record/migrators.rb +64 -0
  13. data/lib/dynamic_migrations/name_helper.rb +13 -0
  14. data/lib/dynamic_migrations/postgres/generator/column.rb +92 -0
  15. data/lib/dynamic_migrations/postgres/generator/foreign_key_constraint.rb +84 -0
  16. data/lib/dynamic_migrations/postgres/generator/fragment.rb +30 -0
  17. data/lib/dynamic_migrations/postgres/generator/function.rb +77 -0
  18. data/lib/dynamic_migrations/postgres/generator/index.rb +101 -0
  19. data/lib/dynamic_migrations/postgres/generator/primary_key.rb +55 -0
  20. data/lib/dynamic_migrations/postgres/generator/schema.rb +19 -0
  21. data/lib/dynamic_migrations/postgres/generator/schema_migrations/section.rb +37 -0
  22. data/lib/dynamic_migrations/postgres/generator/schema_migrations.rb +92 -0
  23. data/lib/dynamic_migrations/postgres/generator/table.rb +122 -0
  24. data/lib/dynamic_migrations/postgres/generator/trigger.rb +101 -0
  25. data/lib/dynamic_migrations/postgres/generator/unique_constraint.rb +79 -0
  26. data/lib/dynamic_migrations/postgres/generator/validation.rb +87 -0
  27. data/lib/dynamic_migrations/postgres/generator.rb +359 -0
  28. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/functions.rb +68 -0
  29. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/columns.rb +72 -0
  30. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/foreign_key_constraints.rb +73 -0
  31. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/indexes.rb +73 -0
  32. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/primary_key.rb +49 -0
  33. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/triggers.rb +73 -0
  34. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/unique_constraints.rb +73 -0
  35. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/validations.rb +73 -0
  36. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables.rb +80 -0
  37. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas.rb +48 -0
  38. data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations.rb +59 -0
  39. data/lib/dynamic_migrations/postgres/server/database/differences.rb +76 -16
  40. data/lib/dynamic_migrations/postgres/server/database/keys_and_unique_constraints_loader.rb +35 -9
  41. data/lib/dynamic_migrations/postgres/server/database/loaded_schemas_builder.rb +50 -26
  42. data/lib/dynamic_migrations/postgres/server/database/schema/function.rb +69 -0
  43. data/lib/dynamic_migrations/postgres/server/database/schema/functions.rb +63 -0
  44. data/lib/dynamic_migrations/postgres/server/database/schema/table/column.rb +6 -44
  45. data/lib/dynamic_migrations/postgres/server/database/schema/table/columns.rb +1 -1
  46. data/lib/dynamic_migrations/postgres/server/database/schema/table/foreign_key_constraint.rb +40 -5
  47. data/lib/dynamic_migrations/postgres/server/database/schema/table/index.rb +23 -9
  48. data/lib/dynamic_migrations/postgres/server/database/schema/table/primary_key.rb +21 -6
  49. data/lib/dynamic_migrations/postgres/server/database/schema/table/trigger.rb +151 -0
  50. data/lib/dynamic_migrations/postgres/server/database/schema/table/triggers.rb +66 -0
  51. data/lib/dynamic_migrations/postgres/server/database/schema/table/unique_constraint.rb +19 -9
  52. data/lib/dynamic_migrations/postgres/server/database/schema/table/validation.rb +20 -1
  53. data/lib/dynamic_migrations/postgres/server/database/schema/table.rb +15 -5
  54. data/lib/dynamic_migrations/postgres/server/database/schema/tables.rb +63 -0
  55. data/lib/dynamic_migrations/postgres/server/database/schema.rb +3 -49
  56. data/lib/dynamic_migrations/postgres/server/database/source.rb +21 -0
  57. data/lib/dynamic_migrations/postgres/server/database/structure_loader.rb +22 -112
  58. data/lib/dynamic_migrations/postgres/server/database/triggers_and_functions_loader.rb +131 -0
  59. data/lib/dynamic_migrations/postgres/server/database/validations_loader.rb +10 -4
  60. data/lib/dynamic_migrations/postgres/server/database.rb +2 -1
  61. data/lib/dynamic_migrations/postgres/server.rb +6 -0
  62. data/lib/dynamic_migrations/postgres.rb +1 -1
  63. data/lib/dynamic_migrations/version.rb +1 -1
  64. data/lib/dynamic_migrations.rb +47 -4
  65. metadata +44 -3
  66. data/lib/dynamic_migrations/postgres/data_types.rb +0 -320
@@ -1,320 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DynamicMigrations
4
- module Postgres
5
- module DataTypes
6
- class MissingRequiredAttributeError < StandardError
7
- def initialize data_type, attribute
8
- super "Missing required attribute `#{attribute}` for data_type `#{data_type}`"
9
- end
10
- end
11
-
12
- class UnexpectedPropertyNameError < StandardError
13
- def initialize attribute
14
- super "Unexpected property `#{attribute}`"
15
- end
16
- end
17
-
18
- class UnexpectedPropertyError < StandardError
19
- def initialize data_type, attribute, value
20
- super "Unexpected property `#{attribute}` with value `#{value}` for data_type `#{data_type}`"
21
- end
22
- end
23
-
24
- class UnsupportedTypeError < StandardError
25
- def initialize data_type
26
- super "Unsupported type `#{data_type}`"
27
- end
28
- end
29
-
30
- ATTRIBUTE_NAMES = [
31
- :character_maximum_length,
32
- :character_octet_length,
33
- :numeric_precision,
34
- :numeric_precision_radix,
35
- :numeric_scale,
36
- :datetime_precision,
37
- :interval_type,
38
- :udt_schema,
39
- :udt_name
40
- ].freeze
41
-
42
- DATA_TYPES = {
43
- ARRAY: {
44
- description: "binary data (“byte array”)",
45
- required: [
46
- :udt_schema,
47
- :udt_name
48
- ]
49
- },
50
- "USER-DEFINED": {
51
- description: "binary data (“byte array”)",
52
- required: [
53
- :udt_schema,
54
- :udt_name
55
- ]
56
- },
57
- bigint: {
58
- description: "signed eight-byte integer",
59
- required: [
60
- :numeric_precision,
61
- :numeric_precision_radix,
62
- :numeric_scale
63
- ],
64
- defaults: {
65
- numeric_precision: 64,
66
- numeric_precision_radix: 2,
67
- numeric_scale: 0
68
- }
69
- },
70
- # skipping this, in my tests it automatically turned into a bigint
71
- # bigserial: {
72
- # description: "autoincrementing eight-byte integer"
73
- # },
74
- bit: {
75
- description: "fixed-length bit string",
76
- args: "[ (n) ]",
77
- required: [
78
- :character_maximum_length
79
- ]
80
- },
81
- "bit varying": {
82
- description: "variable-length bit string",
83
- args: "[ (n) ]"
84
- },
85
- boolean: {
86
- description: "logical Boolean (true/false)",
87
- required: []
88
- },
89
- box: {
90
- description: "rectangular box on a plane"
91
- },
92
- bytea: {
93
- description: "binary data (“byte array”)"
94
- },
95
- character: {
96
- description: "fixed-length character string",
97
- args: "[ (n) ]",
98
- required: [
99
- :character_maximum_length,
100
- :character_octet_length
101
- ]
102
- },
103
- "character varying": {
104
- description: "variable-length character string",
105
- args: "[ (n) ]",
106
- required: [
107
- :character_octet_length
108
- ],
109
- defaults: {
110
- character_octet_length: 1073741824
111
- }
112
- },
113
- cidr: {
114
- description: "IPv4 or IPv6 network address"
115
- },
116
- circle: {
117
- description: "circle on a plane"
118
- },
119
- date: {
120
- description: "calendar date (year, month, day)",
121
- required: [
122
- :datetime_precision
123
- ]
124
- },
125
- "double precision": {
126
- description: "double precision floating-point number (8 bytes)",
127
- required: [
128
- :numeric_precision,
129
- :numeric_precision_radix
130
- ]
131
- },
132
- inet: {
133
- description: "IPv4 or IPv6 host address"
134
- },
135
- integer: {
136
- description: "signed four-byte integer",
137
- required: [
138
- :numeric_precision,
139
- :numeric_precision_radix,
140
- :numeric_scale
141
- ],
142
- defaults: {
143
- numeric_precision: 32,
144
- numeric_precision_radix: 2,
145
- numeric_scale: 0
146
- }
147
- },
148
- interval: {
149
- description: "time span",
150
- args: "[ fields ] [ (p) ]",
151
- required: [
152
- :datetime_precision
153
- ]
154
- },
155
- json: {
156
- description: "textual JSON data"
157
- },
158
- jsonb: {
159
- description: "binary JSON data, decomposed"
160
- },
161
- line: {
162
- description: "infinite line on a plane"
163
- },
164
- lseg: {
165
- description: "line segment on a plane"
166
- },
167
- macaddr: {
168
- description: "MAC (Media Access Control) address"
169
- },
170
- macaddr8: {
171
- description: "MAC (Media Access Control) address (EUI-64 format)"
172
- },
173
- money: {
174
- description: "currency amount"
175
- },
176
- numeric: {
177
- description: "exact numeric of selectable precision",
178
- args: "[ (p, s) ]",
179
- required: [
180
- :numeric_precision_radix
181
- ],
182
- optional: [
183
- :numeric_precision,
184
- :numeric_scale
185
- ]
186
- },
187
- path: {
188
- description: "geometric path on a plane"
189
- },
190
- pg_lsn: {
191
- description: "PostgreSQL Log Sequence Number"
192
- },
193
- pg_snapshot: {
194
- description: "user-level transaction ID snapshot"
195
- },
196
- point: {
197
- description: "geometric point on a plane"
198
- },
199
- polygon: {
200
- description: "closed geometric path on a plane"
201
- },
202
- real: {
203
- description: "single precision floating-point number (4 bytes)",
204
- required: [
205
- :numeric_precision,
206
- :numeric_precision_radix
207
- ]
208
- },
209
- smallint: {
210
- description: "signed two-byte",
211
- required: [
212
- :numeric_precision,
213
- :numeric_precision_radix,
214
- :numeric_scale
215
- ]
216
- },
217
- smallserial: {
218
- description: "autoincrementing two-byte"
219
- },
220
- serial: {
221
- description: "autoincrementing four-byte"
222
- },
223
- text: {
224
- description: "variable-length character string",
225
- required: [
226
- :character_octet_length
227
- ],
228
- defaults: {
229
- character_octet_length: 1073741824
230
- }
231
- },
232
- "time without time zone": {
233
- description: "time of day (no time zone)",
234
- args: "[ (p) ]",
235
- required: [
236
- :datetime_precision
237
- ]
238
- },
239
- "time with time zone": {
240
- description: "time of day, including time zone",
241
- args: "[ (p) ]",
242
- required: [
243
- :datetime_precision
244
- ]
245
- },
246
- "timestamp without time zone": {
247
- description: "date and time (no time zone)",
248
- args: "[ (p) ]",
249
- required: [
250
- :datetime_precision
251
- ]
252
- },
253
- "timestamp with time zone": {
254
- description: "date and time, including time zone",
255
- args: "[ (p) ]",
256
- required: [
257
- :datetime_precision
258
- ]
259
- },
260
- tsquery: {
261
- description: "text search query"
262
- },
263
- tsvector: {
264
- description: "text search document"
265
- },
266
- txid_snapshot: {
267
- description: "user-level transaction ID snapshot (deprecated; see pg_snapshot)"
268
- },
269
- uuid: {
270
- description: "universally unique identifier"
271
- },
272
- xml: {
273
- description: "XML data"
274
- }
275
- }.freeze
276
-
277
- def self.default_for data_type, attribute
278
- raise ExpectedSymbolError, data_type unless data_type.is_a? Symbol
279
- raise ExpectedSymbolError, attribute unless attribute.is_a? Symbol
280
- raise UnsupportedTypeError, data_type unless DATA_TYPES.key? data_type
281
-
282
- unless ATTRIBUTE_NAMES.include? attribute
283
- raise UnexpectedPropertyNameError.new attribute
284
- end
285
-
286
- defaults = DATA_TYPES[data_type][:defaults]
287
- defaults && defaults[attribute] || nil
288
- end
289
-
290
- def self.validate_type_exists! data_type
291
- raise ExpectedSymbolError, data_type unless data_type.is_a? Symbol
292
- raise UnsupportedTypeError, data_type unless DATA_TYPES.key? data_type
293
- true
294
- end
295
-
296
- def self.validate_column_properties! data_type, **column_options
297
- validate_type_exists! data_type
298
-
299
- required_attributes = DATA_TYPES[data_type][:required] || []
300
- optional_attributes = DATA_TYPES[data_type][:optional] || []
301
- possible_attributes = required_attributes + optional_attributes
302
-
303
- # assert all required attributes are present
304
- required_attributes.each do |attribute|
305
- unless column_options.key?(attribute) && !column_options[attribute].nil?
306
- raise MissingRequiredAttributeError.new data_type, attribute
307
- end
308
- end
309
-
310
- # assert no unexpected attributes are present
311
- column_options.each do |key, value|
312
- unless value.nil? || possible_attributes.include?(key)
313
- raise UnexpectedPropertyError.new data_type, key, value
314
- end
315
- end
316
- true
317
- end
318
- end
319
- end
320
- end