From 4c50e08ec97852795e75f61fdcb3e2df4a030b9c Mon Sep 17 00:00:00 2001 From: Paul Bob <69730720+Paul-Bob@users.noreply.github.com> Date: Mon, 5 Aug 2024 12:29:55 +0300 Subject: [PATCH] fix: base resource overriding (#3077) * fix: base resource overriding * fix: base resource extension * lint * . * mv base * . * . * . * . * . * . * require base resource * Revert "." This reverts commit cb5ed40064e754830ac60967d157bc24a823230b. * lint * fix warning * fix test * lint * require instead require_relative * just require * proper load --- {lib => app}/avo/base_resource.rb | 0 lib/avo/engine.rb | 12 ++++--- spec/features/avo/resource_extension_spec.rb | 36 ++++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) rename {lib => app}/avo/base_resource.rb (100%) create mode 100644 spec/features/avo/resource_extension_spec.rb diff --git a/lib/avo/base_resource.rb b/app/avo/base_resource.rb similarity index 100% rename from lib/avo/base_resource.rb rename to app/avo/base_resource.rb diff --git a/lib/avo/engine.rb b/lib/avo/engine.rb index fc84374db7..1a03ce0963 100644 --- a/lib/avo/engine.rb +++ b/lib/avo/engine.rb @@ -49,11 +49,15 @@ class Engine < ::Rails::Engine # This undoes Rails' previous nested directories behavior in the `app` dir. # More on this: https://github.com/fxn/zeitwerk/issues/250 avo_directory = Rails.root.join("app", "avo").to_s - ActiveSupport::Dependencies.autoload_paths.delete(avo_directory) + engine_avo_directory = Avo::Engine.root.join("app", "avo").to_s - if Dir.exist?(avo_directory) - Rails.autoloaders.main.push_dir(avo_directory, namespace: Avo) - app.config.watchable_dirs[avo_directory] = [:rb] + [avo_directory, engine_avo_directory].each do |directory_path| + ActiveSupport::Dependencies.autoload_paths.delete(directory_path) + + if Dir.exist?(directory_path) + Rails.autoloaders.main.push_dir(directory_path, namespace: Avo) + app.config.watchable_dirs[directory_path] = [:rb] + end end end diff --git a/spec/features/avo/resource_extension_spec.rb b/spec/features/avo/resource_extension_spec.rb new file mode 100644 index 0000000000..32b4555aac --- /dev/null +++ b/spec/features/avo/resource_extension_spec.rb @@ -0,0 +1,36 @@ +require "rails_helper" + +RSpec.feature "Resource extension", type: :feature do + before_all do + Avo::Resources::CourseLink.define_method :test_base_resource_extension do + some_extended_method + end + end + + it "no extension" do + expect(TestBuddy).not_to receive(:hi).with("Extension successfully") + expect { Avo::Resources::CourseLink.new.test_base_resource_extension }.to raise_error(NameError) + end + + it "with extension" do + file_path = Rails.root.join("app/avo/base_resource.rb") + FileUtils.mkdir_p(File.dirname(file_path)) + File.write file_path, + <<~RUBY + module Avo + class BaseResource < Avo::Resources::Base + def some_extended_method + TestBuddy.hi("Extension successfully") + end + end + end + RUBY + + load file_path + + expect(TestBuddy).to receive(:hi).with("Extension successfully").at_least :once + expect { Avo::Resources::CourseLink.new.test_base_resource_extension }.not_to raise_error + + File.delete(file_path) if File.exist?(file_path) + end +end