From 2f0906a5a3ffed7065ff405d5d19ed2d913fb4ff Mon Sep 17 00:00:00 2001 From: "Marcos G. Zimmermann" Date: Mon, 4 Nov 2024 22:05:28 -0300 Subject: [PATCH] require consumers during the supervisor boot --- .gitignore | 1 + lib/lepus/cli.rb | 2 +- lib/lepus/supervisor.rb | 19 ++++++++++------ lib/lepus/supervisor/config.rb | 9 +------- spec/lepus/supervisor/config_spec.rb | 34 +++++++--------------------- 5 files changed, 23 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index 2b4cb2a..56b49ae 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ /spec/reports/ /tmp/ *.gem +/app/consumers/ diff --git a/lib/lepus/cli.rb b/lib/lepus/cli.rb index c9a8a2a..f25b0bc 100644 --- a/lib/lepus/cli.rb +++ b/lib/lepus/cli.rb @@ -7,7 +7,7 @@ class CLI < Thor method_option :pidfile, type: :string, default: nil method_option :require_file, type: :string, aliases: "-r", default: nil - desc "start FirstConsumer,SeconConsumer ... ,NthConsumer", "Run Consumer" + desc "start FirstConsumer,SecondConsumer ... ,NthConsumer", "Run Consumer" default_command :start def start(consumers = "") diff --git a/lib/lepus/supervisor.rb b/lib/lepus/supervisor.rb index 06ed697..2d2c6a4 100644 --- a/lib/lepus/supervisor.rb +++ b/lib/lepus/supervisor.rb @@ -10,13 +10,8 @@ class Supervisor < Processes::Base class << self def start(**options) # Lepus.config.supervisor = true - configuration = Config.new(**options) - - if configuration.consumers.any? - new(configuration).tap(&:start) - else - abort "No consumers configured. Exiting..." - end + config = Config.new(**options) + new(config).tap(&:start) end end @@ -61,12 +56,22 @@ def boot end end + setup_consumers + run_process_callbacks(:boot) do sync_std_streams end end end + def setup_consumers + Lepus.eager_load_consumers! + + if configuration.consumers.empty? + abort "No consumers found. Exiting..." + end + end + def start_processes configuration.configured_processes.each { |configured_process| start_process(configured_process) } end diff --git a/lib/lepus/supervisor/config.rb b/lib/lepus/supervisor/config.rb index 5261973..c6b36e5 100644 --- a/lib/lepus/supervisor/config.rb +++ b/lib/lepus/supervisor/config.rb @@ -30,14 +30,7 @@ def consumers=(vals) end def consumers - @consumers ||= Dir[Lepus.config.consumers_directory.join("**/*.rb")].map { |path| Pathname.new(path) }.map do |path| - next unless path.extname == ".rb" - next if File.readlines(path.to_s).grep(/abstract_class\s*=\s*true/).any? - - path.relative_path_from(Lepus.config.consumers_directory).to_s.sub(/\.rb$/, "").split("/").map do |part| - part.split("_").collect(&:capitalize).join - end.join("::") - end.compact + @consumers ||= Lepus::Consumer.descendants.reject(&:abstract_class?).map(&:name).compact end protected diff --git a/spec/lepus/supervisor/config_spec.rb b/spec/lepus/supervisor/config_spec.rb index 30ffb9b..04a0700 100644 --- a/spec/lepus/supervisor/config_spec.rb +++ b/spec/lepus/supervisor/config_spec.rb @@ -26,32 +26,14 @@ describe "#consumers" do after { reset_config! } - it "returns an empty array if no consumers are configured" do - Lepus.config.consumers_directory = Pathname.new("/tmp/lepus/consumers") - expect(config.consumers).to eq([]) - end - - context "when consumers are configured" do - before do - Lepus.config.consumers_directory = Pathname.new("/tmp/lepus/consumers") - allow(Dir).to receive(:[]).and_return([ - "/tmp/lepus/consumers/ignore.js", - "/tmp/lepus/consumers/exclude", - "/tmp/lepus/consumers/application_consumer.rb", - "/tmp/lepus/consumers/foo_consumer.rb", - "/tmp/lepus/consumers/namespaced/bar_consumer.rb" - ]) - allow(File).to receive(:readlines).and_return([""]) - expect(File).to receive(:readlines).with("/tmp/lepus/consumers/application_consumer.rb").and_return([ - "class ApplicationConsumer < Lepus::Consumer", - " self.abstract_class = true", - "end" - ]) - end - - it "returns the list of consumers" do - expect(config.consumers).to eq(["FooConsumer", "Namespaced::BarConsumer"]) - end + it "returns all consumer classes that inherit from Lepus::Consumer" do + my_consumer = Class.new(Lepus::Consumer) + abstract_consumer = Class.new(Lepus::Consumer) { self.abstract_class = true } + stub_const("MyConsumer", my_consumer) + stub_const("AbstractConsumer", abstract_consumer) + + expect(config.consumers).to include("MyConsumer") + expect(config.consumers).not_to include("AbstractConsumer") end end end