iknow_view_models 3.9.1 → 3.10.0

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