GildedRose-Refactoring-Kata/python/gilded_rose.py
2025-06-23 22:37:26 +05:30

104 lines
2.9 KiB
Python
Executable File

"""
gilded_rose.py
Refactoring logic for Gilded Rose Module.
Author: Mohammed Mohideen M Z
"""
from dataclasses import dataclass
from abc import ABC, abstractmethod
@dataclass
class Item:
"""Represents an item with a name, sell_in, and quality."""
name: str
sell_in: int
quality: int
def __repr__(self):
return f"{self.name}, {self.sell_in}, {self.quality}"
class ItemUpdater(ABC):
"""Abstract base class for updating item behavior."""
def __init__(self, item):
self.item = item
def update(self):
"""Update the item's sell_in and quality."""
pass
class NormalItem(ItemUpdater):
"""Standard item that degrades in quality as it gets older."""
def update(self):
self.item.sell_in -= 1
if self.item.quality > 0:
self.item.quality -= 1
if self.item.sell_in < 0 and self.item.quality > 0:
self.item.quality -= 1
class AgedBrie(ItemUpdater):
"""Item that increases in quality the older it gets."""
def update(self):
self.item.sell_in -= 1
if self.item.quality < 50:
self.item.quality += 1
if self.item.sell_in < 0 and self.item.quality < 50:
self.item.quality += 1
class BackstagePasses(ItemUpdater):
"""Item that increases in quality as its sell_in date approaches,
but drops to 0 after the concert."""
def update(self):
self.item.sell_in -= 1
if self.item.sell_in < 0:
self.item.quality = 0
else:
if self.item.quality < 50:
self.item.quality += 1
if self.item.sell_in < 10:
self.item.quality += 1
if self.item.sell_in < 5:
self.item.quality += 1
self.item.quality = min(self.item.quality, 50)
class Sulfuras(ItemUpdater):
"""Legendary item that never changes in quality or sell_in."""
class ConjuredItem(ItemUpdater):
"""Item that degrades in quality twice as fast as normal items."""
def update(self):
self.item.sell_in -= 1
degrade = 2
if self.item.sell_in < 0:
degrade *= 2
self.item.quality = max(0, self.item.quality - degrade)
class GildedRose:
"""Main class that manages and updates a list of items."""
def __init__(self, items):
self.items = items
@staticmethod
def create_updater(item):
if item.name == "Aged Brie":
return AgedBrie(item)
elif item.name == "Backstage passes":
return BackstagePasses(item)
elif item.name == "Sulfuras":
return Sulfuras(item)
elif "Conjured" in item.name:
return ConjuredItem(item)
else:
return NormalItem(item)
def update_quality(self):
for item in self.items:
updater = self.create_updater(item)
updater.update()