From 3397d9d0f77af4052630feb4d4d36d8de3c2a3fb Mon Sep 17 00:00:00 2001 From: alpaca-tc Date: Wed, 19 Jun 2024 13:58:52 +0900 Subject: [PATCH] User can use servers other than webrick --- config.ru | 1 + exe/diver_down_web | 5 ++--- lib/diver_down/web.rb | 14 +++++++++----- spec/diver_down/web_spec.rb | 6 +++++- spec/support/diver_down_web.rb | 8 ++++++++ 5 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 spec/support/diver_down_web.rb diff --git a/config.ru b/config.ru index 7a4ec58..9e60649 100644 --- a/config.ru +++ b/config.ru @@ -4,6 +4,7 @@ require 'diver_down' require 'diver_down/web' require 'rack/reloader' require 'rack/contrib' +require 'puma' definition_dir = ENV.fetch('DIVER_DOWN_DIR') metadata = DiverDown::Web::Metadata.new(ENV.fetch('DIVER_DOWN_METADATA')) diff --git a/exe/diver_down_web b/exe/diver_down_web index b223e2b..25fad35 100755 --- a/exe/diver_down_web +++ b/exe/diver_down_web @@ -3,7 +3,6 @@ require 'bundler/setup' require 'rack/contrib' -require 'webrick' require 'diver_down' require 'diver_down-web' require 'optparse' @@ -47,9 +46,9 @@ begin # Rack 2.0 require 'rack' require 'rack/server' - Rack::Server.new(app:, server: :webrick).start + Rack::Server.new(app:).start rescue LoadError # Rack 3.0 require 'rackup' - Rackup::Server.new(app:, server: :webrick).start + Rackup::Server.new(app:).start end diff --git a/lib/diver_down/web.rb b/lib/diver_down/web.rb index 917cbdc..56bec4a 100644 --- a/lib/diver_down/web.rb +++ b/lib/diver_down/web.rb @@ -21,11 +21,15 @@ class Web # For development autoload :DevServerMiddleware, 'diver_down/web/dev_server_middleware' + # @return [DiverDown::Web::DefinitionStore] + def self.store + @store ||= DiverDown::Web::DefinitionStore.new + end + # @param definition_dir [String] # @param metadata [DiverDown::Web::Metadata] # @param store [DiverDown::Web::DefinitionStore] - def initialize(definition_dir:, metadata:, store: DiverDown::Web::DefinitionStore.new) - @store = store + def initialize(definition_dir:, metadata:) @metadata = metadata @files_server = Rack::Files.new(File.join(WEB_DIR)) @@ -39,7 +43,7 @@ def initialize(definition_dir:, metadata:, store: DiverDown::Web::DefinitionStor # @return [Array[Integer, Hash, Array]] def call(env) request = Rack::Request.new(env) - action = DiverDown::Web::Action.new(store: @store, metadata: @metadata, request:) + action = DiverDown::Web::Action.new(store: self.class.store, metadata: @metadata, request:) case [request.request_method, request.path] in ['GET', %r{\A/api/definitions\.json\z}] @@ -114,11 +118,11 @@ def load_definition_files_on_thread(definition_files) definition = definition_loader.load_file(definition_file) # No needed to synchronize because this is executed on a single thread. - @store.set(definition) + self.class.store.set(definition) end # Cache combined_definition - @store.combined_definition + self.class.store.combined_definition end end end diff --git a/spec/diver_down/web_spec.rb b/spec/diver_down/web_spec.rb index 7dc6704..daeb847 100644 --- a/spec/diver_down/web_spec.rb +++ b/spec/diver_down/web_spec.rb @@ -4,7 +4,7 @@ include Rack::Test::Methods def app - @app ||= described_class.new(definition_dir:, metadata:, store:) + @app ||= described_class.new(definition_dir:, metadata:) end let(:definition_dir) do @@ -20,6 +20,10 @@ def app DiverDown::Web::Metadata.new(metadata_path) end + before do + allow(DiverDown::Web).to receive(:store).and_return(store) + end + describe 'GET /' do around do |example| index_path = File.join(DiverDown::Web::WEB_DIR, 'index.html') diff --git a/spec/support/diver_down_web.rb b/spec/support/diver_down_web.rb new file mode 100644 index 0000000..5032dba --- /dev/null +++ b/spec/support/diver_down_web.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +RSpec.configure do |config| + config.after do + # Remove class variable cache + DiverDown::Web.remove_instance_variable(:@store) if DiverDown::Web.instance_variable_defined?(:@store) + end +end