Skip to content
Open
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions other/grocery_store_cart.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
"""
Console-free grocery cart logic.
"""


class GroceryStoreCart:
"""
Maintain cart item quantities and compute totals.

>>> cart = GroceryStoreCart({"apple": 1.5, "milk": 2.0})
>>> cart.add_item("apple", 2)
>>> cart.add_item("milk")
>>> round(cart.total_price(), 2)
5.0
>>> cart.remove_item("apple")
>>> round(cart.total_price(), 2)
3.5
Comment thread
nickzerjeski marked this conversation as resolved.
"""

def __init__(self, price_catalog: dict[str, float]) -> None:
if not price_catalog:
raise ValueError("price_catalog cannot be empty")
self.price_catalog = dict(price_catalog)
self.quantities: dict[str, int] = {}

def add_item(self, item: str, quantity: int = 1) -> None:
if item not in self.price_catalog:
raise KeyError(f"{item!r} is not in the catalog")

Check failure on line 28 in other/grocery_store_cart.py

View workflow job for this annotation

GitHub Actions / ruff

ruff (EM102)

other/grocery_store_cart.py:28:28: EM102 Exception must not use an f-string literal, assign to variable first help: Assign to variable; remove f-string literal
if quantity <= 0:
raise ValueError("quantity must be positive")
self.quantities[item] = self.quantities.get(item, 0) + quantity

def remove_item(self, item: str, quantity: int = 1) -> None:
if quantity <= 0:
raise ValueError("quantity must be positive")
current = self.quantities.get(item, 0)
if current == 0:
raise KeyError(f"{item!r} is not present in the cart")

Check failure on line 38 in other/grocery_store_cart.py

View workflow job for this annotation

GitHub Actions / ruff

ruff (EM102)

other/grocery_store_cart.py:38:28: EM102 Exception must not use an f-string literal, assign to variable first help: Assign to variable; remove f-string literal
if (remaining := current - quantity) > 0:
self.quantities[item] = remaining
else:
self.quantities.pop(item, None)
Comment thread
nickzerjeski marked this conversation as resolved.
Outdated

def total_price(self) -> float:
return sum(
self.price_catalog[item] * qty for item, qty in self.quantities.items()
Comment thread
nickzerjeski marked this conversation as resolved.
)


if __name__ == "__main__":
import doctest

doctest.testmod()
Loading