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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 847b6426a13f947b600789d37e80eb2987018117c916ea0f7a802871a13ca5be
4
- data.tar.gz: 5d2547f725016af1965bc3ec18267c4ad79232f43d41e825e2a5ee035e84a7f3
3
+ metadata.gz: 85aa5f3dd882b989e6a4d1fa8d5d89be347f5f3c215af86851f1ef086d583472
4
+ data.tar.gz: d202810ca019d425b0de503b7a077d164d5919dc9206cf069e93b37ddf432334
5
5
  SHA512:
6
- metadata.gz: 4e23bce06bde36efefec1d58a8a878562292e431a2d81d52e7e7307576a9ed715dfd46ef4600e4b04c49d965393ace84a7e7e9ca49f16b94d6313ceb26fc1816
7
- data.tar.gz: 13450f34bab5d028f4993478b0fe40f49dc572eaf1b75aaef3e320a12236bb0097d674c7296b05325949c30dc6345981e48022007dbe596459b1689e8cb73745
6
+ metadata.gz: 3005ecb2044fd83003ccd444fb2b22d9787b74c929f157573baa084d4d3dff1b2f24d86e30f1ee9bd1e03604a4a0f9a57ec7431cadaea28faa45eda235dbcd28
7
+ data.tar.gz: 82971047b73442cbccaf9e3e80f1386dc373329b91f94260f2daeeb5794f99b3502cc47b911a62da38f7d0932b9fea49ae72319de9fb2d79f8be6035e0a34110
@@ -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 }}
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem 'minitest-ci'
6
+ gem "activerecord", "~> 7.1.0"
7
+ gem "activesupport", "~> 7.1.0"
8
+ gem "actionpack", "~> 7.1.0"
9
+
10
+ gemspec path: '../'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IknowViewModels
4
- VERSION = '3.9.1'
4
+ VERSION = '3.10.0'
5
5
  end
@@ -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
@@ -1,5 +1,5 @@
1
1
  {pkgs}:
2
2
  {
3
- ruby = pkgs.ruby_3_0;
4
- postgresql = pkgs.postgresql_12;
3
+ ruby = pkgs.ruby_3_2;
4
+ postgresql = pkgs.postgresql_14;
5
5
  }
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.9.1
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-02-19 00:00:00.000000000 Z
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