diff --git a/lib/lifer/brain.rb b/lib/lifer/brain.rb index a05cf91..662b7c8 100644 --- a/lib/lifer/brain.rb +++ b/lib/lifer/brain.rb @@ -14,8 +14,13 @@ def init(root: Dir.pwd) def build! brainwash! - [Lifer::Builder::HTML].each do |builder| - builder.execute root: root + # FIXME: + # Make the list of builders configurable via settings. + # + builders = [:html, :rss] + + builders.each do |builder| + Lifer::Builder.find(builder).execute root: root end end diff --git a/lib/lifer/builder.rb b/lib/lifer/builder.rb index 8c6ffab..d2f1ee7 100644 --- a/lib/lifer/builder.rb +++ b/lib/lifer/builder.rb @@ -1,4 +1,22 @@ -module Lifer::Builder +class Lifer::Builder + class << self + def find(name) + result = descendants.detect { |descendant| descendant.name == name } + + raise StandardError, "no builder with name \"%s\"" % name if result.nil? + result + end + + def name + super.split("::").last.downcase.to_sym + end + + private + + def descendants + ObjectSpace.each_object(Class).select { |klass| klass < self } + end + end end require_relative "builder/html" diff --git a/lib/lifer/builder/html.rb b/lib/lifer/builder/html.rb index d1e492c..329c998 100644 --- a/lib/lifer/builder/html.rb +++ b/lib/lifer/builder/html.rb @@ -1,6 +1,6 @@ require "fileutils" -class Lifer::Builder::HTML +class Lifer::Builder::HTML < Lifer::Builder class << self def execute(root:) Dir.chdir Lifer.output_directory do diff --git a/lib/lifer/builder/rss.rb b/lib/lifer/builder/rss.rb index c544cc6..dead891 100644 --- a/lib/lifer/builder/rss.rb +++ b/lib/lifer/builder/rss.rb @@ -4,7 +4,7 @@ # # https://www.rssboard.org/rss-specification # -class Lifer::Builder::RSS +class Lifer::Builder::RSS < Lifer::Builder DEFAULT_FEED_FILENAME = "feed.xml" class << self diff --git a/spec/lifer/brain_spec.rb b/spec/lifer/brain_spec.rb index 0c3f2b8..9ce4672 100644 --- a/spec/lifer/brain_spec.rb +++ b/spec/lifer/brain_spec.rb @@ -11,6 +11,9 @@ allow(Lifer::Builder::HTML) .to receive(:execute) .and_return(instance_double Lifer::Builder::HTML) + allow(Lifer::Builder::RSS) + .to receive(:execute) + .and_return(instance_double Lifer::Builder::RSS) end it "cleans up any existing output directory" do @@ -33,10 +36,12 @@ it "executes a build" do allow(Lifer::Builder::HTML).to receive(:execute).with(root: root) + allow(Lifer::Builder::RSS).to receive(:execute).with(root: root) subject expect(Lifer::Builder::HTML).to have_received(:execute).with(root: root) + expect(Lifer::Builder::RSS).to have_received(:execute).with(root: root) end end diff --git a/spec/lifer/builder/html_spec.rb b/spec/lifer/builder/html_spec.rb index 738fc94..ab12df6 100644 --- a/spec/lifer/builder/html_spec.rb +++ b/spec/lifer/builder/html_spec.rb @@ -97,4 +97,10 @@ end end end + + describe ".name" do + subject { described_class.name } + + it { is_expected.to eq :html } + end end diff --git a/spec/lifer/builder/rss_spec.rb b/spec/lifer/builder/rss_spec.rb index 065b2c5..e67c084 100644 --- a/spec/lifer/builder/rss_spec.rb +++ b/spec/lifer/builder/rss_spec.rb @@ -42,5 +42,10 @@ end end end -end + describe ".name" do + subject { described_class.name } + + it { is_expected.to eq :rss } + end +end diff --git a/spec/lifer/builder_spec.rb b/spec/lifer/builder_spec.rb new file mode 100644 index 0000000..3707974 --- /dev/null +++ b/spec/lifer/builder_spec.rb @@ -0,0 +1,28 @@ +require "spec_helper" + +RSpec.describe Lifer::Builder do + describe ".find" do + subject { described_class.find name } + + context "when a builder with the given name exists" do + let(:name) { :html } + + it { is_expected.to eq Lifer::Builder::HTML } + end + + context "when a builder with the given name does not exist" do + let(:name) { :doesntexist } + + it "raises an error" do + expect { subject } + .to raise_error StandardError, "no builder with name \"doesntexist\"" + end + end + end + + describe ".name" do + subject { described_class.name } + + it { is_expected.to eq :builder } + end +end