From 4ec3e41b9c3756505e994b086f4370633a5de451 Mon Sep 17 00:00:00 2001 From: Luca Guidi Date: Wed, 20 Sep 2023 10:11:19 +0200 Subject: [PATCH] Handle `Hanami::AppLoadError` --- lib/hanami/action.rb | 12 +++++++---- spec/unit/hanami/action/config_spec.rb | 30 +++++++++++++++++++++----- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/lib/hanami/action.rb b/lib/hanami/action.rb index 73ef78e1..b0d05c05 100644 --- a/lib/hanami/action.rb +++ b/lib/hanami/action.rb @@ -67,11 +67,15 @@ def self.gem_loader cookie_options.to_h.compact } setting :root_directory, constructor: -> (dir) { - if Hanami.respond_to?(:app) && Hanami.app - Hanami.app.root - else - Pathname(File.expand_path(dir || Dir.pwd)).realpath + begin + if Hanami.respond_to?(:app) && Hanami.app + return Hanami.app.root + end + rescue StandardError => exception + raise unless exception.is_a?(Hanami::AppLoadError) end + + Pathname(File.expand_path(dir || Dir.pwd)).realpath } setting :public_directory, default: Config::DEFAULT_PUBLIC_DIRECTORY setting :before_callbacks, default: Utils::Callbacks::Chain.new, mutable: true diff --git a/spec/unit/hanami/action/config_spec.rb b/spec/unit/hanami/action/config_spec.rb index 743865e5..ab571af2 100644 --- a/spec/unit/hanami/action/config_spec.rb +++ b/spec/unit/hanami/action/config_spec.rb @@ -98,17 +98,37 @@ context "within a Hanami app" do before do - app = double("Hanami.app", root: root_directory) - allow(Hanami).to receive(:respond_to?).with(:app, true).and_return(true) allow(Hanami).to receive(:respond_to?).with(:app).and_return(true) - allow(Hanami).to receive(:app).and_return(app) end + let(:app) { double("Hanami.app", root: root_directory) } let(:root_directory) { Pathname.new(__dir__).join("spec") } - it "returns the Hanami app root" do - expect(config.root_directory).to eq(root_directory) + context "when app is loaded" do + before do + allow(Hanami).to receive(:app).and_return(app) + end + + it "returns the Hanami app root" do + expect(config.root_directory).to eq(root_directory) + end + end + + context "when app is not loaded" do + before do + unless defined?(Hanami::AppLoadError) + module Hanami + class AppLoadError < StandardError; end + end + end + + expect(Hanami).to receive(:app).and_raise(Hanami::AppLoadError) + end + + it "falls back to standalone gem logic" do + expect(config.root_directory).to eq(Pathname.new(Dir.pwd)) + end end end end