mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-16 06:51:27 +00:00
96 lines
3.1 KiB
Python
Executable File
96 lines
3.1 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
|
|
|
class Item:
|
|
def __init__(self, name, sell_in, quality):
|
|
self.name = name
|
|
self.sell_in = sell_in
|
|
self.quality = quality
|
|
|
|
def __repr__(self):
|
|
return "%s, %s, %s" % (self.name, self.sell_in, self.quality)
|
|
|
|
|
|
class BaseRule:
|
|
def __init__(self, degrade_rate: int = -1) -> None:
|
|
self.degrade_rate = degrade_rate
|
|
|
|
def _calculate_quality_diff(self, item: Item) -> int:
|
|
sell_date_multiplier = 1 + int(item.sell_in < 0)
|
|
return self.degrade_rate * sell_date_multiplier
|
|
|
|
def update_quality(self, item: Item) -> None:
|
|
calculated_new_quality = item.quality + self._calculate_quality_diff(item)
|
|
# The quality of an item is never more than 50 and is never less than 0
|
|
item.quality = min(50, max(0, calculated_new_quality))
|
|
|
|
|
|
class IncreasingQualityRule(BaseRule):
|
|
def __init__(self) -> None:
|
|
super().__init__(1)
|
|
|
|
|
|
class SulfurasRule(BaseRule):
|
|
def update_quality(self, item: Item) -> None:
|
|
# "Sulfuras", being a legendary item, never has to be sold or decreases in Quality
|
|
item.quality = 80
|
|
|
|
|
|
class BackstageRule(IncreasingQualityRule):
|
|
def _calculate_quality_diff(self, item: Item) -> int:
|
|
# If there are more than 10 days until the concert, same rules as parent class apply
|
|
if item.sell_in > 10:
|
|
return super()._calculate_quality_diff(item)
|
|
# If there are 10 or fewer days until the concert, but more than 5, degrade_rate = 2
|
|
if item.sell_in > 5:
|
|
return 2
|
|
# If there are 5 or fewer days until the concert, degrade_rate = 2
|
|
return 3
|
|
|
|
def update_quality(self, item: Item) -> None:
|
|
# Tickets are useless when the concert is in the past
|
|
if item.sell_in < 0:
|
|
item.quality = 0
|
|
return
|
|
super().update_quality(item)
|
|
|
|
|
|
class ConjuredRule(BaseRule):
|
|
def __init__(self):
|
|
super().__init__(-2)
|
|
|
|
|
|
class RuleProvider:
|
|
def __init__(self):
|
|
self.base_rule = BaseRule()
|
|
self.increasing_quality_rule = IncreasingQualityRule()
|
|
self.sulfuras_rule = SulfurasRule()
|
|
self.backstage_rule = BackstageRule()
|
|
self.conjured_rule = ConjuredRule()
|
|
|
|
def get_rule_for_item_name(self, name: str) -> BaseRule:
|
|
if name.lower().startswith('sulfuras'):
|
|
return self.sulfuras_rule
|
|
if name.lower().startswith('aged'):
|
|
return self.increasing_quality_rule
|
|
if name.lower().startswith('backstage'):
|
|
return self.backstage_rule
|
|
if name.lower().startswith('conjured'):
|
|
return self.conjured_rule
|
|
return self.base_rule
|
|
|
|
|
|
class GildedRose(object):
|
|
def __init__(self, items: list[Item]) -> None:
|
|
self.items = items
|
|
self.rule_provider = RuleProvider()
|
|
|
|
def update_quality_over_range(self, update_range: int) -> None:
|
|
for _ in range(update_range): self.update_quality()
|
|
|
|
def update_quality(self) -> None:
|
|
self.advance_day()
|
|
for item in self.items: self.rule_provider.get_rule_for_item_name(item.name).update_quality(item)
|
|
|
|
def advance_day(self) -> None:
|
|
for item in self.items: item.sell_in -= 1
|