From 2c8c66b9e9b8336e44d18522e5633d56326e7817 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 04:02:11 +0000 Subject: [PATCH] Fix: Add validation to InventoryItem to prevent invalid data - Enforce non-empty string for SKU and Batch ID - Enforce non-negative integer for Current Stock - Enforce non-negative number for Daily Burn Rate - Enforce datetime.date for Expiry Date - Add .gitignore to exclude build artifacts and caches Co-authored-by: alfieprojectsdev <11991855+alfieprojectsdev@users.noreply.github.com> --- .gitignore | 10 ++++++++++ balancer/__pycache__/core.cpython-311.pyc | Bin 6479 -> 0 bytes .../test_balancer.cpython-311-pytest-9.0.2.pyc | Bin 11036 -> 0 bytes balancer/core.py | 11 +++++++++++ 4 files changed, 21 insertions(+) create mode 100644 .gitignore delete mode 100644 balancer/__pycache__/core.cpython-311.pyc delete mode 100644 balancer/__pycache__/test_balancer.cpython-311-pytest-9.0.2.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ea28ff --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +__pycache__/ +*.pyc +*.pyo +*.pyd +.pytest_cache/ +.DS_Store +.env +node_modules/ +dist/ +build/ diff --git a/balancer/__pycache__/core.cpython-311.pyc b/balancer/__pycache__/core.cpython-311.pyc deleted file mode 100644 index 87c07de9a5d8ed0f105be2f72e2c1199785de786..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6479 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 diff --git a/balancer/__pycache__/test_balancer.cpython-311-pytest-9.0.2.pyc b/balancer/__pycache__/test_balancer.cpython-311-pytest-9.0.2.pyc deleted file mode 100644 index 6f98c7be9059da035ae21852888bd63ab51a5017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11036 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 diff --git a/balancer/core.py b/balancer/core.py index a6840c4..29373a9 100644 --- a/balancer/core.py +++ b/balancer/core.py @@ -6,6 +6,17 @@ class InventoryItem: def __init__(self, sku: str, batch_id: str, current_stock: int, expiry_date: datetime.date, daily_burn_rate: float): + if not sku or not isinstance(sku, str): + raise ValueError("SKU must be a non-empty string.") + if not batch_id or not isinstance(batch_id, str): + raise ValueError("Batch ID must be a non-empty string.") + if not isinstance(current_stock, int) or current_stock < 0: + raise ValueError("Current stock must be a non-negative integer.") + if not isinstance(expiry_date, datetime.date): + raise TypeError("Expiry date must be a datetime.date object.") + if not isinstance(daily_burn_rate, (int, float)) or daily_burn_rate < 0: + raise ValueError("Daily burn rate must be a non-negative number.") + self.sku = sku self.batch_id = batch_id self.current_stock = current_stock