import csv from io import StringIO def summarize_inventory(csv_text): reader = csv.DictReader(StringIO(csv_text)) if reader.fieldnames != ["item_id", "item", "available"]: raise ValueError("Expected item_id,item,available columns") seen = set() available_ids = [] total_units = 0 for row in reader: if None in row or any(value is None for value in row.values()): raise ValueError("A row has missing or extra fields") item_id = row["item_id"].strip() item = row["item"].strip() quantity_text = row["available"].strip() if not item_id or not item or item_id in seen: raise ValueError("Item IDs must be unique; names are required") if not (quantity_text.isascii() and quantity_text.isdigit()): raise ValueError("Available quantity must contain digits 0-9") quantity = int(quantity_text) if quantity > 999: raise ValueError("Available quantity must be between 0 and 999") seen.add(item_id) total_units += quantity if quantity > 0: available_ids.append(item_id) return { "item_types": len(seen), "available_units": total_units, "available_ids": available_ids, } SAMPLE = """item_id,item,available T1,spade,3 T2,rake,0 T3,watering can,2 T4,hand fork,1 """ if __name__ == "__main__": result = summarize_inventory(SAMPLE) print("Item types:", result["item_types"]) print("Available units:", result["available_units"]) print("Available IDs:", ", ".join(result["available_ids"]))