declare_schema 1.4.0.colin.5 → 1.4.0.colin.7
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/Gemfile.lock +1 -1
- data/lib/declare_schema/model/foreign_key_definition.rb +20 -17
- data/lib/declare_schema/model.rb +21 -24
- data/lib/declare_schema/version.rb +1 -1
- data/lib/generators/declare_schema/migration/migrator.rb +2 -2
- data/spec/lib/declare_schema/model/foreign_key_definition_spec.rb +18 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f8226540260a887af839da5afcb4641217c03ac5a6eb2d7a00da2806188f1ce
|
4
|
+
data.tar.gz: 7eeb464b5bfc9b1fbf88446696ede88b8ea582060658421cf2772e62a6205797
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2294e94f2165ec156807fbf9ba98dea10f191bfda1b4c630f5444ab08ee7f80323e86a9af80e968e20e579e21ba24ddef520312a7f0a146d850b6f8927aa50aa
|
7
|
+
data.tar.gz: 2742ce98af1fb6ef8eb4ba1fa40563a635abb584cc1860efd373a474c6dce9fc1a27b630141f94ea6a23f36602d8381b08d6a33b13b6fd3d352b40df85f37daf
|
data/Gemfile.lock
CHANGED
@@ -7,7 +7,7 @@ module DeclareSchema
|
|
7
7
|
class ForeignKeyDefinition
|
8
8
|
include Comparable
|
9
9
|
|
10
|
-
attr_reader :constraint_name, :model, :foreign_key, :foreign_key_name, :
|
10
|
+
attr_reader :constraint_name, :model, :foreign_key, :foreign_key_name, :child_table_name, :options, :on_delete_cascade
|
11
11
|
|
12
12
|
|
13
13
|
def initialize(model, foreign_key, **options)
|
@@ -19,6 +19,17 @@ module DeclareSchema
|
|
19
19
|
@parent_table_name = options[:parent_table]&.to_s
|
20
20
|
@foreign_key_name = options[:foreign_key]&.to_s || @foreign_key
|
21
21
|
|
22
|
+
@parent_class_name =
|
23
|
+
case class_name = options[:class_name]
|
24
|
+
when String, Symbol
|
25
|
+
class_name.to_s
|
26
|
+
when Class
|
27
|
+
@parent_class = class_name
|
28
|
+
@parent_class.name
|
29
|
+
when nil
|
30
|
+
@foreign_key.sub(/_id\z/, '').camelize
|
31
|
+
end
|
32
|
+
|
22
33
|
@constraint_name = options[:constraint_name]&.to_s.presence ||
|
23
34
|
model.connection.index_name(model.table_name, column: @foreign_key_name)
|
24
35
|
@on_delete_cascade = options[:dependent] == :delete
|
@@ -44,21 +55,13 @@ module DeclareSchema
|
|
44
55
|
end
|
45
56
|
|
46
57
|
# returns the parent class as a Class object
|
47
|
-
#
|
58
|
+
# lazy loaded so that we don't require the parent class until we need it
|
48
59
|
def parent_class
|
49
|
-
|
50
|
-
if class_name.is_a?(Class)
|
51
|
-
class_name
|
52
|
-
else
|
53
|
-
class_name.to_s.constantize
|
54
|
-
end
|
55
|
-
end
|
60
|
+
@parent_class ||= @parent_class_name.constantize
|
56
61
|
end
|
57
62
|
|
58
63
|
def parent_table_name
|
59
|
-
@parent_table_name ||=
|
60
|
-
parent_class&.try(:table_name) ||
|
61
|
-
foreign_key.sub(/_id\z/, '').camelize.constantize.table_name
|
64
|
+
@parent_table_name ||= parent_class.table_name
|
62
65
|
end
|
63
66
|
|
64
67
|
def <=>(rhs)
|
@@ -67,14 +70,14 @@ module DeclareSchema
|
|
67
70
|
|
68
71
|
alias eql? ==
|
69
72
|
|
73
|
+
def hash
|
74
|
+
key.hash
|
75
|
+
end
|
76
|
+
|
70
77
|
private
|
71
78
|
|
72
79
|
def key
|
73
|
-
@key ||= [@child_table_name,
|
74
|
-
end
|
75
|
-
|
76
|
-
def hash
|
77
|
-
key.hash
|
80
|
+
@key ||= [@child_table_name, @parent_class_name, @foreign_key_name, @on_delete_cascade].map(&:to_s)
|
78
81
|
end
|
79
82
|
end
|
80
83
|
end
|
data/lib/declare_schema/model.rb
CHANGED
@@ -57,11 +57,8 @@ module DeclareSchema
|
|
57
57
|
index(fields.flatten, unique: true, name: ::DeclareSchema::Model::IndexDefinition::PRIMARY_KEY_NAME)
|
58
58
|
end
|
59
59
|
|
60
|
-
def constraint(
|
61
|
-
|
62
|
-
unless constraint_specs.any? { |constraint_spec| constraint_spec.foreign_key == fkey_s }
|
63
|
-
constraint_specs << DeclareSchema::Model::ForeignKeyDefinition.new(self, fkey, **options)
|
64
|
-
end
|
60
|
+
def constraint(foreign_key, **options)
|
61
|
+
constraint_specs << DeclareSchema::Model::ForeignKeyDefinition.new(self, foreign_key.to_s, **options)
|
65
62
|
end
|
66
63
|
|
67
64
|
# tell the migration generator to ignore the named index. Useful for existing indexes, or for indexes
|
@@ -152,9 +149,9 @@ module DeclareSchema
|
|
152
149
|
|
153
150
|
super
|
154
151
|
|
155
|
-
|
156
|
-
|
157
|
-
|
152
|
+
reflection = reflections[name.to_s] or raise "Couldn't find reflection #{name} in #{reflections.keys}"
|
153
|
+
foreign_key = reflection.foreign_key or raise "Couldn't find foreign_key for #{name} in #{reflection.inspect}"
|
154
|
+
foreign_key_id_column_options = column_options.dup
|
158
155
|
|
159
156
|
# Note: the foreign key limit: should match the primary key limit:. (If there is a foreign key constraint,
|
160
157
|
# those limits _must_ match.) We'd like to call _infer_fk_limit and get the limit right from the PK.
|
@@ -165,31 +162,31 @@ module DeclareSchema
|
|
165
162
|
# The one downside of this approach is that application code that asks the field_spec for the declared
|
166
163
|
# foreign key limit: will always get 8 back even if this is a grandfathered foreign key that points to
|
167
164
|
# a limit: 4 primary key. It seems unlikely that any application code would do this.
|
168
|
-
|
169
|
-
if (inferred_limit = _infer_fk_limit(
|
165
|
+
foreign_key_id_column_options[:pre_migration] = ->(field_spec) do
|
166
|
+
if (inferred_limit = _infer_fk_limit(foreign_key, reflection))
|
170
167
|
field_spec.sql_options[:limit] = inferred_limit
|
171
168
|
end
|
172
169
|
end
|
173
170
|
|
174
|
-
declare_field(
|
171
|
+
declare_field(foreign_key.to_sym, :bigint, **foreign_key_id_column_options)
|
175
172
|
|
176
|
-
if
|
173
|
+
if reflection.options[:polymorphic]
|
177
174
|
foreign_type = options[:foreign_type] || "#{name}_type"
|
178
175
|
_declare_polymorphic_type_field(foreign_type, column_options)
|
179
|
-
index([foreign_type,
|
176
|
+
index([foreign_type, foreign_key], **index_options) if index_options
|
180
177
|
else
|
181
|
-
index(
|
182
|
-
constraint(
|
178
|
+
index(foreign_key, **index_options) if index_options
|
179
|
+
constraint(foreign_key, **fk_options) if fk_options[:constraint_name] != false
|
183
180
|
end
|
184
181
|
end
|
185
182
|
|
186
|
-
def _infer_fk_limit(
|
187
|
-
if
|
188
|
-
if (
|
189
|
-
|
183
|
+
def _infer_fk_limit(foreign_key, reflection)
|
184
|
+
if reflection.options[:polymorphic]
|
185
|
+
if (foreign_key_column = columns_hash[foreign_key.to_s]) && foreign_key_column.type == :integer
|
186
|
+
foreign_key_column.limit
|
190
187
|
end
|
191
188
|
else
|
192
|
-
klass =
|
189
|
+
klass = reflection.klass or raise "Couldn't find belongs_to klass for #{name} in #{reflection.inspect}"
|
193
190
|
if (pk_id_type = klass._table_options&.[](:id))
|
194
191
|
if pk_id_type == :integer
|
195
192
|
4
|
@@ -320,11 +317,11 @@ module DeclareSchema
|
|
320
317
|
end
|
321
318
|
|
322
319
|
attr_types[name] ||
|
323
|
-
if (
|
324
|
-
if
|
325
|
-
|
320
|
+
if (reflection = reflections[name.to_s])
|
321
|
+
if reflection.macro.in?([:has_one, :belongs_to]) && !reflection.options[:polymorphic]
|
322
|
+
reflection.klass
|
326
323
|
else
|
327
|
-
|
324
|
+
reflection
|
328
325
|
end
|
329
326
|
end ||
|
330
327
|
if (col = _column(name.to_s))
|
@@ -426,7 +426,7 @@ module Generators
|
|
426
426
|
|
427
427
|
new_table_name = model.table_name
|
428
428
|
existing_indexes = ::DeclareSchema::Model::IndexDefinition.for_model(model, old_table_name)
|
429
|
-
model_indexes_with_equivalents = model.index_definitions_with_primary_key
|
429
|
+
model_indexes_with_equivalents = model.index_definitions_with_primary_key.to_a
|
430
430
|
model_indexes = model_indexes_with_equivalents.map do |i|
|
431
431
|
if i.explicit_name.nil?
|
432
432
|
if (existing = existing_indexes.find { |e| i != e && e.equivalent?(i) })
|
@@ -486,7 +486,7 @@ module Generators
|
|
486
486
|
::DeclareSchema.default_generate_foreign_keys or return []
|
487
487
|
|
488
488
|
existing_fks = ::DeclareSchema::Model::ForeignKeyDefinition.for_model(model, old_table_name)
|
489
|
-
model_fks = model.constraint_specs
|
489
|
+
model_fks = model.constraint_specs.to_a
|
490
490
|
|
491
491
|
fks_to_drop = existing_fks - model_fks
|
492
492
|
fks_to_add = model_fks - existing_fks
|
@@ -60,6 +60,24 @@ RSpec.describe DeclareSchema::Model::ForeignKeyDefinition do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
describe `#<=>` do
|
64
|
+
context 'when class name not passed' do
|
65
|
+
let(:options) { { foreign_key: :the_network_id, constraint_name: :constraint_1, dependent: :delete } }
|
66
|
+
|
67
|
+
it 'compares equal without requring the parent class' do
|
68
|
+
expect(subject <=> subject).to eq(0)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'when class name passed' do
|
73
|
+
let(:options) { { foreign_key: :the_network_id, class_name: 'TheNetwork', constraint_name: :constraint_1 } }
|
74
|
+
|
75
|
+
it 'compares equal without requring the parent class' do
|
76
|
+
expect(subject <=> subject).to eq(0)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
63
81
|
context 'when constraint name passed as empty string' do
|
64
82
|
let(:options) { { constraint_name: "" } }
|
65
83
|
it 'defaults to rails constraint name' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: declare_schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.0.colin.
|
4
|
+
version: 1.4.0.colin.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Invoca Development adapted from hobo_fields by Tom Locke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|