iknow_view_models 3.9.1 → 3.10.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.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +3 -1
- data/gemfiles/rails_7_1.gemfile +10 -0
- data/lib/iknow_view_models/version.rb +1 -1
- data/lib/view_model/active_record/controller.rb +2 -47
- data/lib/view_model/after_transaction_runner.rb +17 -0
- data/lib/view_model/controller/migration_versions.rb +52 -0
- data/nix/dependencies.nix +2 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85aa5f3dd882b989e6a4d1fa8d5d89be347f5f3c215af86851f1ef086d583472
|
4
|
+
data.tar.gz: d202810ca019d425b0de503b7a077d164d5919dc9206cf069e93b37ddf432334
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3005ecb2044fd83003ccd444fb2b22d9787b74c929f157573baa084d4d3dff1b2f24d86e30f1ee9bd1e03604a4a0f9a57ec7431cadaea28faa45eda235dbcd28
|
7
|
+
data.tar.gz: 82971047b73442cbccaf9e3e80f1386dc373329b91f94260f2daeeb5794f99b3502cc47b911a62da38f7d0932b9fea49ae72319de9fb2d79f8be6035e0a34110
|
data/.github/workflows/test.yml
CHANGED
@@ -26,7 +26,7 @@ jobs:
|
|
26
26
|
strategy:
|
27
27
|
fail-fast: false
|
28
28
|
matrix:
|
29
|
-
ruby-version: ['2.7', '3.0', '3.1', '3.2']
|
29
|
+
ruby-version: ['2.7', '3.0', '3.1', '3.2', '3.3']
|
30
30
|
include:
|
31
31
|
- ruby-version: '2.7'
|
32
32
|
bundle-gemfile: gemfiles/rails_5_2.gemfile
|
@@ -36,6 +36,8 @@ jobs:
|
|
36
36
|
bundle-gemfile: gemfiles/rails_6_1.gemfile
|
37
37
|
- ruby-version: '3.2'
|
38
38
|
bundle-gemfile: gemfiles/rails_7_0.gemfile
|
39
|
+
- ruby-version: '3.3'
|
40
|
+
bundle-gemfile: gemfiles/rails_7_1.gemfile
|
39
41
|
|
40
42
|
env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
|
41
43
|
BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.bundle-gemfile }}
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'view_model/active_record/controller_base'
|
4
4
|
require 'view_model/active_record/collection_nested_controller'
|
5
5
|
require 'view_model/active_record/singular_nested_controller'
|
6
|
+
require 'view_model/controller/migration_versions'
|
6
7
|
|
7
8
|
# Controller for accessing an ViewModel::ActiveRecord
|
8
9
|
# Provides for the following routes:
|
@@ -16,8 +17,7 @@ module ViewModel::ActiveRecord::Controller
|
|
16
17
|
include ViewModel::ActiveRecord::ControllerBase
|
17
18
|
include ViewModel::ActiveRecord::CollectionNestedController
|
18
19
|
include ViewModel::ActiveRecord::SingularNestedController
|
19
|
-
|
20
|
-
MIGRATION_VERSION_HEADER = 'X-ViewModel-Versions'
|
20
|
+
include ViewModel::Controller::MigrationVersions
|
21
21
|
|
22
22
|
def show(scope: nil, viewmodel_class: self.viewmodel_class, serialize_context: new_serialize_context(viewmodel_class: viewmodel_class))
|
23
23
|
view = nil
|
@@ -95,51 +95,6 @@ module ViewModel::ActiveRecord::Controller
|
|
95
95
|
parse_param(:id)
|
96
96
|
end
|
97
97
|
|
98
|
-
def migration_versions
|
99
|
-
@migration_versions ||=
|
100
|
-
begin
|
101
|
-
specified_migration_versions.reject do |viewmodel_class, required_version|
|
102
|
-
viewmodel_class.schema_version == required_version
|
103
|
-
end.freeze
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def specified_migration_versions
|
108
|
-
@specified_migration_versions ||=
|
109
|
-
begin
|
110
|
-
version_spec =
|
111
|
-
if params.include?(:versions)
|
112
|
-
params[:versions]
|
113
|
-
elsif request.headers.include?(MIGRATION_VERSION_HEADER)
|
114
|
-
begin
|
115
|
-
JSON.parse(request.headers[MIGRATION_VERSION_HEADER])
|
116
|
-
rescue JSON::ParserError
|
117
|
-
raise ViewModel::Error.new(status: 400, detail: "Invalid JSON in #{MIGRATION_VERSION_HEADER}")
|
118
|
-
end
|
119
|
-
else
|
120
|
-
{}
|
121
|
-
end
|
122
|
-
|
123
|
-
versions =
|
124
|
-
IknowParams::Parser.parse_value(
|
125
|
-
version_spec,
|
126
|
-
with: IknowParams::Serializer::HashOf.new(
|
127
|
-
IknowParams::Serializer::String, IknowParams::Serializer::Integer))
|
128
|
-
|
129
|
-
migration_versions = {}
|
130
|
-
|
131
|
-
versions.each do |view_name, required_version|
|
132
|
-
viewmodel_class = ViewModel::Registry.for_view_name(view_name)
|
133
|
-
migration_versions[viewmodel_class] = required_version
|
134
|
-
rescue ViewModel::DeserializationError::UnknownView
|
135
|
-
# Ignore requests to migrate types that no longer exist
|
136
|
-
next
|
137
|
-
end
|
138
|
-
|
139
|
-
migration_versions.freeze
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
98
|
def migrated_deep_schema_version
|
144
99
|
ViewModel::Migrator.migrated_deep_schema_version(viewmodel_class, migration_versions, include_referenced: true)
|
145
100
|
end
|
@@ -4,6 +4,23 @@
|
|
4
4
|
# `add_to_transaction`, the abstract method `after_transaction` will be invoked
|
5
5
|
# by AR's callbacks.
|
6
6
|
module ViewModel::AfterTransactionRunner
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
# Rails 7.1+ expects after transaction hooks to declare whether to run the
|
11
|
+
# hook on the first equivalent instance to be enqueued or the last one. For
|
12
|
+
# ActiveRecord models, this class method is defined on ActiveRecord::Core
|
13
|
+
# and delegates to Rails configuration. For us, we don't expect multiple
|
14
|
+
# equivalent AfterTransactionRunners for the same callback, and opting into
|
15
|
+
# the new behaviour would require implementing more of the ActiveRecord
|
16
|
+
# model interface here such as #destroyed?, so we'll lock in the older
|
17
|
+
# behavior that doesn't require so many inapplicable heuristics to identify
|
18
|
+
# the last valid callback.
|
19
|
+
def run_commit_callbacks_on_first_saved_instances_in_transaction
|
20
|
+
true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
7
24
|
# Rails' internal API
|
8
25
|
def committed!(*)
|
9
26
|
after_commit
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ViewModel::Controller::MigrationVersions
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
MIGRATION_VERSION_HEADER = 'X-ViewModel-Versions'
|
7
|
+
|
8
|
+
def migration_versions
|
9
|
+
@migration_versions ||=
|
10
|
+
begin
|
11
|
+
specified_migration_versions.reject do |viewmodel_class, required_version|
|
12
|
+
viewmodel_class.schema_version == required_version
|
13
|
+
end.freeze
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def specified_migration_versions
|
18
|
+
@specified_migration_versions ||=
|
19
|
+
begin
|
20
|
+
version_spec =
|
21
|
+
if params.include?(:versions)
|
22
|
+
params[:versions]
|
23
|
+
elsif request.headers.include?(MIGRATION_VERSION_HEADER)
|
24
|
+
begin
|
25
|
+
JSON.parse(request.headers[MIGRATION_VERSION_HEADER])
|
26
|
+
rescue JSON::ParserError
|
27
|
+
raise ViewModel::Error.new(status: 400, detail: "Invalid JSON in #{MIGRATION_VERSION_HEADER}")
|
28
|
+
end
|
29
|
+
else
|
30
|
+
{}
|
31
|
+
end
|
32
|
+
|
33
|
+
versions =
|
34
|
+
IknowParams::Parser.parse_value(
|
35
|
+
version_spec,
|
36
|
+
with: IknowParams::Serializer::HashOf.new(
|
37
|
+
IknowParams::Serializer::String, IknowParams::Serializer::Integer))
|
38
|
+
|
39
|
+
migration_versions = {}
|
40
|
+
|
41
|
+
versions.each do |view_name, required_version|
|
42
|
+
viewmodel_class = ViewModel::Registry.for_view_name(view_name)
|
43
|
+
migration_versions[viewmodel_class] = required_version
|
44
|
+
rescue ViewModel::DeserializationError::UnknownView
|
45
|
+
# Ignore requests to migrate types that no longer exist
|
46
|
+
next
|
47
|
+
end
|
48
|
+
|
49
|
+
migration_versions.freeze
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/nix/dependencies.nix
CHANGED
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.
|
4
|
+
version: 3.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iKnow Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -396,6 +396,7 @@ files:
|
|
396
396
|
- gemfiles/rails_6_0.gemfile
|
397
397
|
- gemfiles/rails_6_1.gemfile
|
398
398
|
- gemfiles/rails_7_0.gemfile
|
399
|
+
- gemfiles/rails_7_1.gemfile
|
399
400
|
- iknow_view_models.gemspec
|
400
401
|
- lib/iknow_view_models.rb
|
401
402
|
- lib/iknow_view_models/railtie.rb
|
@@ -427,6 +428,7 @@ files:
|
|
427
428
|
- lib/view_model/changes.rb
|
428
429
|
- lib/view_model/config.rb
|
429
430
|
- lib/view_model/controller.rb
|
431
|
+
- lib/view_model/controller/migration_versions.rb
|
430
432
|
- lib/view_model/deserialization_error.rb
|
431
433
|
- lib/view_model/deserialize_context.rb
|
432
434
|
- lib/view_model/error.rb
|