From 48483089fcb1e04bd0a74d8e734984d06f4ba94e Mon Sep 17 00:00:00 2001 From: Nikita Shilnikov Date: Thu, 9 Jan 2025 12:17:40 +0100 Subject: [PATCH] Bring back Repository#set_relation but deprecate it (fix #698) It was part of the private API used by hanami/db. This marks prepare_relation as a replacement --- .../lib/rom/repository/relation_reader.rb | 14 +++++-- .../spec/integration/repository_spec.rb | 37 +++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/repository/lib/rom/repository/relation_reader.rb b/repository/lib/rom/repository/relation_reader.rb index 7f6fefc42..054e2fb1d 100644 --- a/repository/lib/rom/repository/relation_reader.rb +++ b/repository/lib/rom/repository/relation_reader.rb @@ -5,9 +5,11 @@ class Repository # @api private class RelationReader < ::Module module InstanceMethods + extend ::Dry::Core::Deprecations[:'rom-repository'] + private - # @api private + # @api public def prepare_relation(name, **) container .relations[name] @@ -17,6 +19,12 @@ def prepare_relation(name, **) ) end + # @api private + def set_relation(name) # rubocop:disable Naming/AccessorMethodName + prepare_relation(name) + end + deprecate :set_relation, :prepare_relation + # @api private def relation_reader(cache, ...) cache_key = relation_cache_key(...) @@ -24,8 +32,8 @@ def relation_reader(cache, ...) end # @api private - def relation_cache_key(name, **) - [name, auto_struct, struct_namespace] + def relation_cache_key(name, **kwargs) + [name, auto_struct, struct_namespace, kwargs] end end diff --git a/repository/spec/integration/repository_spec.rb b/repository/spec/integration/repository_spec.rb index 80f1ba81e..a00188446 100644 --- a/repository/spec/integration/repository_spec.rb +++ b/repository/spec/integration/repository_spec.rb @@ -423,4 +423,41 @@ class Post < OpenStruct; end expect(post).to be(post_from_user) end + + context 'using #prepare_relation' do + let(:repo_class) do + Class.new(ROM::Repository[:users]) do + def prepare_relation(name, custom: 'default') + super.select_append { `'#{custom}'`.as(:extra_column) } + end + end + end + + it 'is uses modified relation' do + expect(repo.users.to_a.map(&:extra_column)).to eql(%w[default default]) + expect(repo.users(custom: 'custom').to_a.map(&:extra_column)).to eql(%w[custom custom]) + end + end + + context 'using #set_relation' do + let(:log_file) do + Tempfile.new('dry_deprecations') + end + + before do + Dry::Core::Deprecations.set_logger!(log_file) + end + + let(:repo_class) do + Class.new(ROM::Repository[:users]) do + def custom_users + set_relation(:users).select_append { `'modified'`.as(:modified) } + end + end + end + + it "constructs a relation but it's deprecated" do + expect(repo.custom_users.to_a.map(&:modified)).to eql(%w[modified modified]) + end + end end