diff --git a/Gemfile b/Gemfile index c3a2e59..281288e 100644 --- a/Gemfile +++ b/Gemfile @@ -7,3 +7,5 @@ source "https://rubygems.org" gem "rspec", "~> 3.12" gem "simplecov", "~> 0.22.0" + +gem "simplecov-console", "~> 0.9.1" diff --git a/Gemfile.lock b/Gemfile.lock index ac73bdf..8e0458e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,7 @@ GEM remote: https://rubygems.org/ specs: + ansi (1.5.0) diff-lcs (1.5.0) docile (1.4.0) rspec (3.12.0) @@ -20,8 +21,15 @@ GEM docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) + simplecov-console (0.9.1) + ansi + simplecov + terminal-table simplecov-html (0.12.3) simplecov_json_formatter (0.1.4) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + unicode-display_width (2.4.2) PLATFORMS arm64-darwin-22 @@ -29,6 +37,7 @@ PLATFORMS DEPENDENCIES rspec (~> 3.12) simplecov (~> 0.22.0) + simplecov-console (~> 0.9.1) BUNDLED WITH 2.4.18 diff --git a/lib/brie_updater.rb b/lib/brie_updater.rb index 906dee1..ce79adc 100644 --- a/lib/brie_updater.rb +++ b/lib/brie_updater.rb @@ -1,15 +1,11 @@ # frozen_string_literal: true -require_relative 'updater' - -class BrieUpdater < Updater - def self.handles?(item) +class BrieUpdater + def handles?(item) item.name == 'Aged Brie' end - Updater.register(self) - - def update + def update(item) item.sell_in -= 1 return if item.quality >= 50 diff --git a/lib/conjured_updater.rb b/lib/conjured_updater.rb index 11ac52b..2df8d29 100644 --- a/lib/conjured_updater.rb +++ b/lib/conjured_updater.rb @@ -1,15 +1,11 @@ # frozen_string_literal: true -require_relative 'updater' - -class ConjuredUpdater < Updater - def self.handles?(item) +class ConjuredUpdater + def handles?(item) item.name.start_with?('Conjured') end - Updater.register(self) - - def update + def update(item) item.sell_in -= 1 return if item.quality <= 0 diff --git a/lib/gilded_rose.rb b/lib/gilded_rose.rb index 81f5a44..de42d2c 100644 --- a/lib/gilded_rose.rb +++ b/lib/gilded_rose.rb @@ -1,20 +1,35 @@ # frozen_string_literal: true require_relative 'item' -require_relative 'updater' +require_relative 'normal_updater' require_relative 'brie_updater' require_relative 'pass_updater' require_relative 'sulfuras_updater' require_relative 'conjured_updater' +DEFAULT_UPDATERS = [ + ConjuredUpdater.new, + BrieUpdater.new, + PassUpdater.new, + SulfurasUpdater.new, + NormalUpdater.new +].freeze + class GildedRose - def initialize(items) + def initialize(items, updaters = DEFAULT_UPDATERS) @items = items + @updaters = updaters end def update_quality @items.each do |item| - Updater.for(item).update + find_updater_for(item).update(item) end end + + private + + def find_updater_for(item) + @updaters.find { |updater| updater.handles?(item) } + end end diff --git a/lib/normal_updater.rb b/lib/normal_updater.rb new file mode 100644 index 0000000..af6ba96 --- /dev/null +++ b/lib/normal_updater.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class NormalUpdater + def handles?(item) + true + end + + def update(item) + item.sell_in -= 1 + return if item.quality <= 0 + + item.quality -= 1 + item.quality -= 1 if item.sell_in <= 0 && item.quality > 0 + end +end diff --git a/lib/pass_updater.rb b/lib/pass_updater.rb index 70fb24a..51ac189 100644 --- a/lib/pass_updater.rb +++ b/lib/pass_updater.rb @@ -1,15 +1,11 @@ # frozen_string_literal: true -require_relative 'updater' - -class PassUpdater < Updater - def self.handles?(item) +class PassUpdater + def handles?(item) item.name.start_with?('Backstage pass') end - Updater.register(self) - - def update + def update(item) item.sell_in -= 1 return item.quality = 0 if item.sell_in.negative? return if item.quality >= 50 diff --git a/lib/sulfuras_updater.rb b/lib/sulfuras_updater.rb index 1e7769b..b68d5e6 100644 --- a/lib/sulfuras_updater.rb +++ b/lib/sulfuras_updater.rb @@ -1,13 +1,9 @@ # frozen_string_literal: true -require_relative 'updater' - -class SulfurasUpdater < Updater - def self.handles?(item) +class SulfurasUpdater + def handles?(item) item.name == 'Sulfuras, Hand of Ragnaros' end - Updater.register(self) - - def update; end + def update(item); end end diff --git a/lib/updater.rb b/lib/updater.rb deleted file mode 100644 index 1af37e4..0000000 --- a/lib/updater.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -class Updater - def self.for(item) - registry.find { |candidate| candidate.handles?(item) }.new(item) - end - - def self.registry - @registry ||= [] - end - - def self.register(candidate) - registry.prepend(candidate) - end - - # Updater defaults to handling Normal Items - def self.handles?(item) - true - end - - Updater.register(self) - - attr_accessor :item - - def initialize(item) - @item = item - end - - def update - item.sell_in -= 1 - return if item.quality <= 0 - - item.quality -= 1 - item.quality -= 1 if item.sell_in <= 0 && item.quality > 0 - end -end