iknow_view_models 3.5.2 → 3.5.3
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27ea471c380869f02c7f103025a151b53d99a1c8f19181566852f12f78ba7cd3
|
4
|
+
data.tar.gz: dc18591e8c0b39e986cd0895e691e6d4d3a89df6cf04c4c486b3ecfc8699da4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 156474c34631689f937fda7e3f4a2b2421a8205b3d172a2e72476aa8e440c5bb45b760aaf72a9e70ae9ff9830a209f8be727eb27d233a875aabf963ad88ce85b
|
7
|
+
data.tar.gz: 8e39b0542bef145e8bbc6e6c30ff17d4ff4de2e08c93f7cc7b228cccdac6443159de74e9e3419fada058c09c38b1eba571d4f16633ce83abe6972331a8a4017c
|
@@ -34,14 +34,36 @@ module ViewModel::MigratableView
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
protected
|
38
|
+
|
39
|
+
def migration_class(from, to)
|
40
|
+
@migration_classes.fetch([from, to]) do
|
41
|
+
raise ViewModel::Migration::NoPathError.new(self, from, to)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
37
45
|
private
|
38
46
|
|
39
47
|
# Define a migration on this viewmodel
|
40
|
-
def migrates(from:, to:, &block)
|
48
|
+
def migrates(from:, to:, inherit: nil, at: nil, &block)
|
41
49
|
@migrations_lock.synchronize do
|
42
|
-
|
50
|
+
migration_superclass =
|
51
|
+
if inherit
|
52
|
+
raise ArgumentError.new('Must provide inherit version') unless at
|
53
|
+
|
54
|
+
inherit.migration_class(at - 1, at)
|
55
|
+
else
|
56
|
+
ViewModel::Migration
|
57
|
+
end
|
58
|
+
|
59
|
+
builder = ViewModel::Migration::Builder.new(migration_superclass)
|
43
60
|
builder.instance_exec(&block)
|
44
|
-
|
61
|
+
|
62
|
+
migration_class = builder.build!
|
63
|
+
|
64
|
+
const_set(:"Migration_#{from}_To_#{to}", migration_class)
|
65
|
+
@migration_classes[[from, to]] = migration_class
|
66
|
+
|
45
67
|
@realized_migration_paths = false
|
46
68
|
end
|
47
69
|
end
|
data/lib/view_model/migration.rb
CHANGED
@@ -15,13 +15,14 @@ class ViewModel::Migration
|
|
15
15
|
|
16
16
|
# Tiny DSL for defining migration classes
|
17
17
|
class Builder
|
18
|
-
def initialize
|
18
|
+
def initialize(superclass = ViewModel::Migration)
|
19
|
+
@superclass = superclass
|
19
20
|
@up_block = nil
|
20
21
|
@down_block = nil
|
21
22
|
end
|
22
23
|
|
23
24
|
def build!
|
24
|
-
migration = Class.new(
|
25
|
+
migration = Class.new(@superclass)
|
25
26
|
migration.define_method(:up, &@up_block) if @up_block
|
26
27
|
migration.define_method(:down, &@down_block) if @down_block
|
27
28
|
migration
|
@@ -206,6 +206,55 @@ module ViewModelSpecHelpers
|
|
206
206
|
end
|
207
207
|
end
|
208
208
|
|
209
|
+
module SingleWithInheritedMigration
|
210
|
+
extend ActiveSupport::Concern
|
211
|
+
include ViewModelSpecHelpers::Base
|
212
|
+
|
213
|
+
def migration_bearing_viewmodel_class
|
214
|
+
define_viewmodel_class(
|
215
|
+
:MigrationBearingView,
|
216
|
+
namespace: namespace,
|
217
|
+
viewmodel_base: viewmodel_base,
|
218
|
+
model_base: model_base,
|
219
|
+
spec: ViewModel::TestHelpers::ARVMBuilder::Spec.new(
|
220
|
+
schema: ->(_) {},
|
221
|
+
model: ->(_) {},
|
222
|
+
viewmodel: ->(v) {
|
223
|
+
root!
|
224
|
+
self.schema_version = 2
|
225
|
+
migrates from: 1, to: 2 do
|
226
|
+
down do |view, _refs|
|
227
|
+
view['inherited_base'] = 'present'
|
228
|
+
end
|
229
|
+
end
|
230
|
+
}))
|
231
|
+
end
|
232
|
+
|
233
|
+
def model_attributes
|
234
|
+
migration_bearing_viewmodel_class = self.migration_bearing_viewmodel_class
|
235
|
+
|
236
|
+
super.merge(
|
237
|
+
schema: ->(t) { t.integer :new_field, default: 1, null: false },
|
238
|
+
viewmodel: ->(_v) {
|
239
|
+
self.schema_version = 2
|
240
|
+
|
241
|
+
attribute :new_field
|
242
|
+
|
243
|
+
migrates from: 1, to: 2, inherit: migration_bearing_viewmodel_class, at: 2 do
|
244
|
+
down do |view, refs|
|
245
|
+
super(view, refs)
|
246
|
+
view.delete('new_field')
|
247
|
+
end
|
248
|
+
|
249
|
+
up do |view, refs|
|
250
|
+
view.delete('inherited_base')
|
251
|
+
view['new_field'] = 100
|
252
|
+
end
|
253
|
+
end
|
254
|
+
})
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
209
258
|
module ParentAndBelongsToChildWithMigration
|
210
259
|
extend ActiveSupport::Concern
|
211
260
|
include ViewModelSpecHelpers::ParentAndBelongsToChild
|
@@ -210,6 +210,69 @@ class ViewModel::ActiveRecord::Migration < ActiveSupport::TestCase
|
|
210
210
|
end
|
211
211
|
end
|
212
212
|
|
213
|
+
describe 'inherited migrations' do
|
214
|
+
include ViewModelSpecHelpers::SingleWithInheritedMigration
|
215
|
+
|
216
|
+
def new_model
|
217
|
+
model_class.new(name: 'm1')
|
218
|
+
end
|
219
|
+
|
220
|
+
let(:migration_versions) { { viewmodel_class => 1 } }
|
221
|
+
|
222
|
+
let(:v1_serialization_data) do
|
223
|
+
{
|
224
|
+
ViewModel::TYPE_ATTRIBUTE => viewmodel_class.view_name,
|
225
|
+
ViewModel::VERSION_ATTRIBUTE => 1,
|
226
|
+
ViewModel::ID_ATTRIBUTE => viewmodel.id,
|
227
|
+
'name' => viewmodel.name,
|
228
|
+
'inherited_base' => 'present',
|
229
|
+
}
|
230
|
+
end
|
231
|
+
|
232
|
+
let(:v1_serialization_references) { {} }
|
233
|
+
|
234
|
+
let(:v1_serialization) do
|
235
|
+
{
|
236
|
+
'data' => v1_serialization_data,
|
237
|
+
'references' => v1_serialization_references,
|
238
|
+
}
|
239
|
+
end
|
240
|
+
|
241
|
+
describe 'downwards' do
|
242
|
+
let(:migrator) { down_migrator }
|
243
|
+
let(:subject) { current_serialization.deep_dup }
|
244
|
+
let(:expected_result) do
|
245
|
+
v1_serialization.deep_merge({ 'data' => { ViewModel::MIGRATED_ATTRIBUTE => true } })
|
246
|
+
end
|
247
|
+
|
248
|
+
it 'migrates' do
|
249
|
+
migrate!
|
250
|
+
assert_equal(expected_result, subject)
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
describe 'upwards' do
|
255
|
+
let(:migrator) { up_migrator }
|
256
|
+
let(:subject) { v1_serialization.deep_dup }
|
257
|
+
|
258
|
+
let(:expected_result) do
|
259
|
+
current_serialization.deep_merge(
|
260
|
+
{
|
261
|
+
'data' => {
|
262
|
+
ViewModel::MIGRATED_ATTRIBUTE => true,
|
263
|
+
'new_field' => 100,
|
264
|
+
},
|
265
|
+
},
|
266
|
+
)
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'migrates' do
|
270
|
+
migrate!
|
271
|
+
assert_equal(expected_result, subject)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
213
276
|
describe 'garbage collection' do
|
214
277
|
include ViewModelSpecHelpers::ParentAndSharedBelongsToChild
|
215
278
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iknow_view_models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.5.
|
4
|
+
version: 3.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iKnow Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|