From 10638c43a0e0c21af5b2872d66d9c6437b57122b Mon Sep 17 00:00:00 2001 From: Dasun Pubudumal Date: Mon, 26 Jan 2026 17:15:40 +0000 Subject: [PATCH 01/18] Fix for Rails 8.1 - updating the `Resource` instantiation with the latest API changes Based on merge pull request #10 from sanger/rails-8.1-fix --- lib/jsonapi/resources/version.rb | 2 +- lib/jsonapi/routing_ext.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jsonapi/resources/version.rb b/lib/jsonapi/resources/version.rb index 07ba6bd5f..d9a2c2bad 100644 --- a/lib/jsonapi/resources/version.rb +++ b/lib/jsonapi/resources/version.rb @@ -1,5 +1,5 @@ module JSONAPI module Resources - VERSION = '0.1.2' + VERSION = '0.1.3' end end diff --git a/lib/jsonapi/routing_ext.rb b/lib/jsonapi/routing_ext.rb index 77af89e7a..152f8902a 100644 --- a/lib/jsonapi/routing_ext.rb +++ b/lib/jsonapi/routing_ext.rb @@ -51,7 +51,7 @@ def jsonapi_resource(*resources, &_block) end else # Rails 5 - jsonapi_resource_scope(SingletonResource.new(@resource_type, api_only?, @scope[:shallow], options), @resource_type) do + jsonapi_resource_scope(SingletonResource.new(@resource_type, api_only?, @scope[:shallow], **options), @resource_type) do if block_given? yield else @@ -119,7 +119,7 @@ def jsonapi_resources(*resources, &_block) end else # Rails 5 - jsonapi_resource_scope(Resource.new(@resource_type, api_only?, @scope[:shallow], options), @resource_type) do + jsonapi_resource_scope(Resource.new(@resource_type, api_only?, @scope[:shallow], **options), @resource_type) do if block_given? yield else From 28c36410be63b45bfb338cb08344db2853f971dc Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Fri, 3 Jul 2026 13:16:48 +0100 Subject: [PATCH 02/18] ci: add latest versions to ci --- .github/workflows/ruby.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index 60f056246..a2b95b25e 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -13,11 +13,14 @@ jobs: fail-fast: false matrix: ruby: - - '3.3' - '3.2' + - '3.3' + - '3.4' rails: - '7.1' - '7.2' + - '8.0' + - '8.1' database_url: - sqlite3:test_db env: @@ -25,7 +28,7 @@ jobs: DATABASE_URL: ${{ matrix.database_url }} name: Ruby ${{ matrix.ruby }} Rails ${{ matrix.rails }} DB ${{ matrix.database_url }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v7 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: From 9448226e4ff6aec0393ea583262ff06ecd1db676 Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Fri, 3 Jul 2026 13:26:58 +0100 Subject: [PATCH 03/18] test: repair deprecation warning --- test/test_helper.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 206fe8bd6..dd956e077 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -56,6 +56,11 @@ class TestApp < Rails::Application config.active_record.time_zone_aware_types = [:time, :datetime] config.active_record.belongs_to_required_by_default = false end + + # Use a modern cache serialization format to avoid Rails 7.2+ deprecations. + if Rails::VERSION::MAJOR >= 7 && config.active_support.respond_to?(:cache_format_version=) + config.active_support.cache_format_version = 7.1 + end end module MyEngine From 2b135b6c4316800eea350ac79216fbe2c699a9be Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Fri, 3 Jul 2026 13:34:19 +0100 Subject: [PATCH 04/18] build: update min versions --- Gemfile | 4 ++-- jsonapi-resources.gemspec | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 805949eb6..7ca51d586 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source 'https://rubygems.org' gemspec platforms :ruby do - gem 'sqlite3', '>= 1.4' + gem 'sqlite3', '>= 2.1' end platforms :jruby do @@ -17,7 +17,7 @@ when 'master' gem 'railties', { git: 'https://github.com/rails/rails.git' } gem 'arel', { git: 'https://github.com/rails/arel.git' } when 'default' - gem 'railties', '~> 7.1.0' + gem 'railties', '~> 8.1.0' else gem 'railties', "~> #{version}" end diff --git a/jsonapi-resources.gemspec b/jsonapi-resources.gemspec index 9942ddf9e..9df9d299c 100644 --- a/jsonapi-resources.gemspec +++ b/jsonapi-resources.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |spec| spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ['lib'] - spec.required_ruby_version = '>= 2.1' + spec.required_ruby_version = '>= 3.2' spec.add_development_dependency 'bundler', '>= 1.5', '< 3.0' spec.add_development_dependency 'rake' From cb9b8bdc71fe82bbe6602c0326b6234014c77110 Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Fri, 3 Jul 2026 13:54:36 +0100 Subject: [PATCH 05/18] fix: use Rails 8.2 options syntax --- lib/jsonapi/routing_ext.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jsonapi/routing_ext.rb b/lib/jsonapi/routing_ext.rb index 152f8902a..d72637f3f 100644 --- a/lib/jsonapi/routing_ext.rb +++ b/lib/jsonapi/routing_ext.rb @@ -38,7 +38,7 @@ def jsonapi_resource(*resources, &_block) options[:except] << :destroy unless options[:except].include?(:destroy) || options[:except].include?('destroy') end - resource @resource_type, options do + resource @resource_type, **options do # :nocov: if @scope.respond_to? :[]= # Rails 4 @@ -107,7 +107,7 @@ def jsonapi_resources(*resources, &_block) options[:except] << :destroy unless options[:except].include?(:destroy) || options[:except].include?('destroy') end - resources @resource_type, options do + resources @resource_type, **options do # :nocov: if @scope.respond_to? :[]= # Rails 4 From f24b0e766223d77f4fdb69ba6e7d2d92a69f1c4a Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Fri, 3 Jul 2026 13:58:51 +0100 Subject: [PATCH 06/18] wip: try fix cannot load such file -- minitest/mock (LoadError) --- jsonapi-resources.gemspec | 1 + 1 file changed, 1 insertion(+) diff --git a/jsonapi-resources.gemspec b/jsonapi-resources.gemspec index 9df9d299c..319e338f1 100644 --- a/jsonapi-resources.gemspec +++ b/jsonapi-resources.gemspec @@ -22,6 +22,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'bundler', '>= 1.5', '< 3.0' spec.add_development_dependency 'rake' spec.add_development_dependency 'minitest' + spec.add_development_dependency 'minitest-mock' spec.add_development_dependency 'minitest-spec-rails' spec.add_development_dependency 'simplecov' spec.add_development_dependency 'pry' From f7c219c88dd008670c2528bd40757d8e0978d7db Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Mon, 17 Aug 2026 11:57:50 +0100 Subject: [PATCH 07/18] build: remove support for Rails 7.1, add support for Rails 8.1 --- .github/workflows/ruby.yml | 17 ++++++++--------- jsonapi-resources.gemspec | 4 ++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index a2b95b25e..3dd5fbd7b 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [ 'develop' ] + branches: ["develop"] pull_request: - branches: ['**'] + branches: ["**"] jobs: tests: @@ -13,14 +13,13 @@ jobs: fail-fast: false matrix: ruby: - - '3.2' - - '3.3' - - '3.4' + - "3.2" + - "3.3" + - "3.4" rails: - - '7.1' - - '7.2' - - '8.0' - - '8.1' + - "7.2" + - "8.0" + - "8.1" database_url: - sqlite3:test_db env: diff --git a/jsonapi-resources.gemspec b/jsonapi-resources.gemspec index 7b5e13975..d5f6b33d8 100644 --- a/jsonapi-resources.gemspec +++ b/jsonapi-resources.gemspec @@ -28,8 +28,8 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'simplecov' spec.add_development_dependency 'pry' spec.add_development_dependency 'concurrent-ruby-ext' - spec.add_dependency 'activerecord', '>= 7.1', '< 8.1' # versions 7.1, 7.2, 8.0 - spec.add_dependency 'railties', '>= 7.1', '< 8.1' # versions 7.1, 7.2, 8.0 + spec.add_dependency 'activerecord', '>= 7.2', '< 8.2' # versions 7.2, 8.0, 8.1 + spec.add_dependency 'railties', '>= 7.2', '< 8.2' # versions 7.2, 8.0, 8.1 spec.add_dependency 'rack', '~> 3.0' spec.add_dependency 'concurrent-ruby' spec.add_runtime_dependency 'csv' From 93eb882a9720a8e244e1f5fa53457dd03fcea5e1 Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Mon, 17 Aug 2026 12:13:06 +0100 Subject: [PATCH 08/18] test: update error message for Rails 8.1 --- test/integration/requests/request_test.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/integration/requests/request_test.rb b/test/integration/requests/request_test.rb index f6ff20e7c..fbbadd144 100644 --- a/test/integration/requests/request_test.rb +++ b/test/integration/requests/request_test.rb @@ -384,7 +384,9 @@ def test_put_invalid_json assert_equal 400, status assert_equal 'Bad Request', json_response['errors'][0]['title'] - assert_match 'unexpected token at', json_response['errors'][0]['detail'] + rails_7_2_msg = 'unexpected token at' + rails_8_1_msg = "expected ',' or '}' after object value, got: '\"attributes\":'" + assert_match (/(#{rails_7_2_msg}|#{rails_8_1_msg})/), json_response['errors'][0]['detail'] end def test_put_valid_json_but_array From 1f9dc81c026479a3ea073c0522b9a9e6e0d15585 Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Wed, 19 Aug 2026 14:39:38 +0100 Subject: [PATCH 09/18] build: relax version constraints --- .github/workflows/ruby.yml | 1 + jsonapi-resources.gemspec | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index 3dd5fbd7b..650740193 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -20,6 +20,7 @@ jobs: - "7.2" - "8.0" - "8.1" + - "8.2" database_url: - sqlite3:test_db env: diff --git a/jsonapi-resources.gemspec b/jsonapi-resources.gemspec index d5f6b33d8..a8e8ea24f 100644 --- a/jsonapi-resources.gemspec +++ b/jsonapi-resources.gemspec @@ -28,8 +28,8 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'simplecov' spec.add_development_dependency 'pry' spec.add_development_dependency 'concurrent-ruby-ext' - spec.add_dependency 'activerecord', '>= 7.2', '< 8.2' # versions 7.2, 8.0, 8.1 - spec.add_dependency 'railties', '>= 7.2', '< 8.2' # versions 7.2, 8.0, 8.1 + spec.add_dependency 'activerecord', '>= 7.2', '~> 8.0' # versions 7.2, 8.0, 8.1, and above + spec.add_dependency 'railties', '>= 7.2', '~> 8.0' # versions 7.2, 8.0, 8.1, and above spec.add_dependency 'rack', '~> 3.0' spec.add_dependency 'concurrent-ruby' spec.add_runtime_dependency 'csv' From 56c83fc5ab7ac3ecd2bc4f0aeae6eefa349739e0 Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Wed, 19 Aug 2026 14:47:04 +0100 Subject: [PATCH 10/18] build: limit max rails version to < 9.0 --- jsonapi-resources.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jsonapi-resources.gemspec b/jsonapi-resources.gemspec index a8e8ea24f..71bfd308e 100644 --- a/jsonapi-resources.gemspec +++ b/jsonapi-resources.gemspec @@ -28,8 +28,8 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'simplecov' spec.add_development_dependency 'pry' spec.add_development_dependency 'concurrent-ruby-ext' - spec.add_dependency 'activerecord', '>= 7.2', '~> 8.0' # versions 7.2, 8.0, 8.1, and above - spec.add_dependency 'railties', '>= 7.2', '~> 8.0' # versions 7.2, 8.0, 8.1, and above + spec.add_dependency 'activerecord', '>= 7.2', '< 9.0' # versions 7.2, 8.0, 8.1, and above, but not 9.0 + spec.add_dependency 'railties', '>= 7.2', '< 9.0' # versions 7.2, 8.0, 8.1, and above, but not 9.0 spec.add_dependency 'rack', '~> 3.0' spec.add_dependency 'concurrent-ruby' spec.add_runtime_dependency 'csv' From fe2a6cbe458ccb5a78073e0edf4ed45563f9143e Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Wed, 19 Aug 2026 14:51:02 +0100 Subject: [PATCH 11/18] build: Rails 8.2 doesn't exist yet... woops! --- .github/workflows/ruby.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index 650740193..3dd5fbd7b 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -20,7 +20,6 @@ jobs: - "7.2" - "8.0" - "8.1" - - "8.2" database_url: - sqlite3:test_db env: From 8efa5642a835fc9d6f1fb18ad3f7fd956d2f423c Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Thu, 20 Aug 2026 10:19:39 +0100 Subject: [PATCH 12/18] release: bump patch version --- lib/jsonapi/resources/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsonapi/resources/version.rb b/lib/jsonapi/resources/version.rb index d9a2c2bad..1910ee687 100644 --- a/lib/jsonapi/resources/version.rb +++ b/lib/jsonapi/resources/version.rb @@ -1,5 +1,5 @@ module JSONAPI module Resources - VERSION = '0.1.3' + VERSION = '0.1.4' end end From 509ac9accbd9a89a710d2ae31539f17ff102d5e5 Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Thu, 20 Aug 2026 15:11:19 +0100 Subject: [PATCH 13/18] fix: remove unused Rails 4 code --- lib/jsonapi/routing_ext.rb | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/lib/jsonapi/routing_ext.rb b/lib/jsonapi/routing_ext.rb index d72637f3f..1aa3b4647 100644 --- a/lib/jsonapi/routing_ext.rb +++ b/lib/jsonapi/routing_ext.rb @@ -39,27 +39,13 @@ def jsonapi_resource(*resources, &_block) end resource @resource_type, **options do - # :nocov: - if @scope.respond_to? :[]= - # Rails 4 - @scope[:jsonapi_resource] = @resource_type - + jsonapi_resource_scope(SingletonResource.new(@resource_type, api_only?, @scope[:shallow], **options), @resource_type) do if block_given? yield else jsonapi_relationships end - else - # Rails 5 - jsonapi_resource_scope(SingletonResource.new(@resource_type, api_only?, @scope[:shallow], **options), @resource_type) do - if block_given? - yield - else - jsonapi_relationships - end - end end - # :nocov: end end @@ -108,26 +94,13 @@ def jsonapi_resources(*resources, &_block) end resources @resource_type, **options do - # :nocov: - if @scope.respond_to? :[]= - # Rails 4 - @scope[:jsonapi_resource] = @resource_type + jsonapi_resource_scope(Resource.new(@resource_type, api_only?, @scope[:shallow], **options), @resource_type) do if block_given? yield else jsonapi_relationships end - else - # Rails 5 - jsonapi_resource_scope(Resource.new(@resource_type, api_only?, @scope[:shallow], **options), @resource_type) do - if block_given? - yield - else - jsonapi_relationships - end - end end - # :nocov: end end From 77d668ea70d659fb6932c0cab0b040a60f6683e0 Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Thu, 20 Aug 2026 12:02:10 +0100 Subject: [PATCH 14/18] test: use the best reporter for each test environment --- test/test_helper.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index a74f4a18e..0d9e62954 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -30,7 +30,12 @@ require File.expand_path('../helpers/functional_helpers', __FILE__) require File.expand_path('../helpers/configuration_helpers', __FILE__) -Minitest::Reporters.use! +if ENV['CI'] == 'true' + # The SpecReporter is easier to read on GitHub + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new +else + Minitest::Reporters.use! +end Rails.env = 'test' From ac2ea51dd7234ee97818d798fdd1f37c0beb537b Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Tue, 11 Aug 2026 14:19:15 +0100 Subject: [PATCH 15/18] test: reduce verbosity of minitest output --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 7c629c8a6..ab54301ee 100644 --- a/Rakefile +++ b/Rakefile @@ -3,7 +3,7 @@ require 'bundler/gem_tasks' require 'rake/testtask' Rake::TestTask.new do |t| - t.verbose = true + t.verbose = false t.warning = false t.test_files = FileList['test/**/*_test.rb'] end From d548d52b17377a188d5598081da3a7249edfe7bf Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Mon, 17 Aug 2026 15:22:50 +0100 Subject: [PATCH 16/18] test: highlight rails version in tests --- test/test_helper.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 0d9e62954..1003fe84f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -46,6 +46,9 @@ config.json_key_format = :camelized_key end +puts "-" * 32 +puts "Testing With RAILS VERSION #{Rails.version}" +puts "-" * 32 class TestApp < Rails::Application config.eager_load = false From d8cec3999189fa4193092b2198cab39b4d8c8c74 Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Thu, 20 Aug 2026 11:45:53 +0100 Subject: [PATCH 17/18] test: remove test-db as part of the rake task run --- Rakefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index ab54301ee..070b26fba 100644 --- a/Rakefile +++ b/Rakefile @@ -1,14 +1,21 @@ #!/usr/bin/env rake require 'bundler/gem_tasks' +require 'fileutils' require 'rake/testtask' +task :remove_test_db do + FileUtils.rm_f(File.expand_path('test/test_db', __dir__)) +end + Rake::TestTask.new do |t| t.verbose = false t.warning = false t.test_files = FileList['test/**/*_test.rb'] end -task default: :test +Rake::Task[:test].enhance([:remove_test_db]) + +task default: [:test] desc 'Run benchmarks' namespace :test do From 09c1ed76086843a5e2ff4b8d6f98c0e17b63d028 Mon Sep 17 00:00:00 2001 From: Stephen Hulme Date: Thu, 20 Aug 2026 12:10:19 +0100 Subject: [PATCH 18/18] test: add patch to Rails version specifier for correct resolution --- Gemfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Gemfile b/Gemfile index 7ca51d586..553831609 100644 --- a/Gemfile +++ b/Gemfile @@ -11,6 +11,8 @@ platforms :jruby do end version = ENV['RAILS_VERSION'] || 'default' +# If version is like 'x.y' add a '.0' to make it 'x.y.0' for correct resolution +version = "#{version}.0" if version =~ /^\d+\.\d+$/ case version when 'master'