diff --git a/gemfiles/rails52.gemfile b/gemfiles/rails52.gemfile index fa488ee..395a676 100644 --- a/gemfiles/rails52.gemfile +++ b/gemfiles/rails52.gemfile @@ -2,4 +2,4 @@ source "https://rubygems.org" gemspec path: ".." -gem 'rails', '~> 5.2', '>= 5.2.8.1' +gem "rails", "~> 5.2", ">= 5.2.8.1" diff --git a/gemfiles/rails61.gemfile b/gemfiles/rails61.gemfile index 38e2e2a..924366c 100644 --- a/gemfiles/rails61.gemfile +++ b/gemfiles/rails61.gemfile @@ -2,4 +2,4 @@ source "https://rubygems.org" gemspec path: ".." -gem 'rails', '~> 6.1', '>= 6.1.7.10' +gem "rails", "~> 6.1", ">= 6.1.7.10" diff --git a/lib/lepus/supervisor/config.rb b/lib/lepus/supervisor/config.rb index b5a4241..286aa70 100644 --- a/lib/lepus/supervisor/config.rb +++ b/lib/lepus/supervisor/config.rb @@ -30,10 +30,13 @@ def consumers=(vals) end def consumers - @consumers ||= begin - Lepus.eager_load_consumers! - Lepus::Consumer.descendants.reject(&:abstract_class?).map(&:name) - end + @consumers ||= Dir[Lepus.config.consumers_directory.join("**/*.rb")].map { |path| Pathname.new(path) }.map do |path| + next unless path.extname == ".rb" + + 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 end protected diff --git a/spec/lepus/process_registry_spec.rb b/spec/lepus/process_registry_spec.rb index e485f9e..e9d9f88 100644 --- a/spec/lepus/process_registry_spec.rb +++ b/spec/lepus/process_registry_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Lepus::ProcessRegistry do after do - Lepus::ProcessRegistry.instance.clear + described_class.instance.clear end let(:supervisor) { instance_double(Lepus::Process, id: "p1") } @@ -12,66 +12,66 @@ describe "#add" do it "adds a process to the registry" do - Lepus::ProcessRegistry.instance.add(supervisor) + described_class.instance.add(supervisor) - expect(Lepus::ProcessRegistry.instance.instance_variable_get(:@processes)).to eq("p1" => supervisor) + expect(described_class.instance.instance_variable_get(:@processes)).to eq("p1" => supervisor) end end describe "#delete" do it "deletes a process from the registry" do - Lepus::ProcessRegistry.instance.add(supervisor) - Lepus::ProcessRegistry.instance.add(process) + described_class.instance.add(supervisor) + described_class.instance.add(process) - Lepus::ProcessRegistry.instance.delete(process) + described_class.instance.delete(process) - expect(Lepus::ProcessRegistry.instance.all).to eq([supervisor]) + expect(described_class.instance.all).to eq([supervisor]) end end describe "#find" do it "returns a process by id" do - Lepus::ProcessRegistry.instance.add(supervisor) + described_class.instance.add(supervisor) - expect(Lepus::ProcessRegistry.instance.find("p1")).to eq(supervisor) + expect(described_class.instance.find("p1")).to eq(supervisor) end it "raises an error when the process does not exist" do expect do - Lepus::ProcessRegistry.instance.find("non-existing") + described_class.instance.find("non-existing") end.to raise_error(Lepus::Process::NotFoundError) end end describe "#exists?" do it "returns true when a process exists" do - Lepus::ProcessRegistry.instance.add(supervisor) + described_class.instance.add(supervisor) - expect(Lepus::ProcessRegistry.instance.exists?("p1")).to be(true) + expect(described_class.instance.exists?("p1")).to be(true) end it "returns false when a process does not exist" do - expect(Lepus::ProcessRegistry.instance.exists?("non-existing")).to be(false) + expect(described_class.instance.exists?("non-existing")).to be(false) end end describe "#all" do it "returns all processes" do - Lepus::ProcessRegistry.instance.add(supervisor) - Lepus::ProcessRegistry.instance.add(process) + described_class.instance.add(supervisor) + described_class.instance.add(process) - expect(Lepus::ProcessRegistry.instance.all).to eq([supervisor, process]) + expect(described_class.instance.all).to eq([supervisor, process]) end end describe "#clear" do it "clears all processes" do - Lepus::ProcessRegistry.instance.add(supervisor) - Lepus::ProcessRegistry.instance.add(process) + described_class.instance.add(supervisor) + described_class.instance.add(process) - Lepus::ProcessRegistry.instance.clear + described_class.instance.clear - expect(Lepus::ProcessRegistry.instance.all).to eq([]) + expect(described_class.instance.all).to eq([]) end end end diff --git a/spec/lepus/process_spec.rb b/spec/lepus/process_spec.rb index fff763b..c4732b2 100644 --- a/spec/lepus/process_spec.rb +++ b/spec/lepus/process_spec.rb @@ -18,7 +18,7 @@ describe ".prune" do it "deletes all processes that are not running" do - prune = described_class.register(last_heartbeat_at: Time.now - 5 * 60, name: "prune-me") + described_class.register(last_heartbeat_at: Time.now - 5 * 60, name: "prune-me") keep = described_class.register(last_heartbeat_at: Time.now, name: "keep-me") described_class.prune @@ -58,7 +58,7 @@ describe "#deregister" do it "removes the process from the registry and deregisters supervisees" do supervisor1 = described_class.register(name: "supervisor-1") - supervisee1 = described_class.register(name: "supervisee-1", supervisor_id: supervisor1.id) + described_class.register(name: "supervisee-1", supervisor_id: supervisor1.id) supervisor2 = described_class.register(name: "supervisor-2") supervisee2 = described_class.register(name: "supervisee-2", supervisor_id: supervisor2.id) diff --git a/spec/lepus/supervisor/config_spec.rb b/spec/lepus/supervisor/config_spec.rb new file mode 100644 index 0000000..0d13e70 --- /dev/null +++ b/spec/lepus/supervisor/config_spec.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe Lepus::Supervisor::Config do + let(:config) { described_class.new } + + describe "#initialize" do + it "sets the pidfile" do + expect(config.pidfile).to eq("tmp/pids/lepus.pid") + end + + it "sets the require_file" do + expect(config.require_file).to be_nil + + config = described_class.new(require_file: "config/environment") + expect(config.require_file).to eq("config/environment") + end + + it "sets the consumers" do + config = described_class.new(consumers: ["MyConsumer"]) + expect(config.consumers).to eq(["MyConsumer"]) + end + end + + 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/foo_consumer.rb", + "/tmp/lepus/consumers/namespaced/bar_consumer.rb" + ]) + end + + it "returns the list of consumers" do + expect(config.consumers).to eq(["FooConsumer", "Namespaced::BarConsumer"]) + end + end + end +end