dynamic_migrations 2.1.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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