From ac9316d4c33b552e6885ae5602c19d0cb175b1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yi=C4=9Fitcan=20=C3=96zt=C3=BCrk?= <318303091+yigitcan-ozturk@users.noreply.github.com> Date: Fri, 28 Aug 2026 11:07:56 +0300 Subject: [PATCH 1/2] docs: add v0.2.0 release changelog --- CHANGELOG.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5948bca --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,48 @@ +# Changelog + +All notable changes to `rfqdiff` are documented here. + +## [0.2.0] - Unreleased + +Release hardening is in progress. The package metadata and machine-readable contract are on the v0.2 line; the latest published GitHub Release is still v0.1.0 until the v0.2.0 release is created. + +### Added + +- Installable Python package and `rfqdiff` console CLI. +- Stable v0.2 machine-readable JSON integration payload. +- CSV quotation import with multiple suppliers per file. +- Excel (`.xlsx`) quotation import with multiple suppliers per worksheet. +- Strict configurable commercial scoring weights for price, lead time and payment terms. +- CSV and Excel comparison report export. +- Source provenance for file-loaded quotations, including filename, format, SHA-256 fingerprint, and tabular row/sheet location where applicable. +- Criterion-level score breakdowns for price, lead time and payment terms. +- Runner-up selection, score margin and deterministic decision explanations. +- Public Python helpers for quotation loading, weight validation and report export. +- Test coverage across Python 3.11, 3.12 and 3.13. +- Wheel/source-distribution build validation and installed-package smoke tests in CI. + +### Changed + +- Clarified `rfqdiff` as the commercial quotation-comparison component of the procurement toolchain. +- Kept mixed-currency normalization outside `rfqdiff` and delegated it to `currency-normalizer`. +- Kept technical compliance outside `rfqdiff` and delegated it to `bidlint`. +- Preserved upstream normalization metadata through scoring and downstream JSON output. +- Made report exports derive from the same scored payload used by the integration contract. + +### Compatibility + +- Existing JSON quotation inputs remain supported. +- The original `python main.py ...` workflow remains supported alongside the installed CLI. +- The default scoring model remains price 50%, lead time 30%, payment terms 20%. +- New v0.2 explanation and provenance fields are additive; the final supplier `score` remains the downstream quotation-score handoff. + +## [0.1.0] - 2026-08-19 + +First public release. + +### Added + +- Compare multiple supplier quotations from JSON files. +- Score price, lead time and payment terms. +- Highlight lowest price and fastest lead time. +- Generate a simple supplier recommendation. From 3f2700e43c162a47073c40dd8b8a4278078f638f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yi=C4=9Fitcan=20=C3=96zt=C3=BCrk?= <318303091+yigitcan-ozturk@users.noreply.github.com> Date: Fri, 28 Aug 2026 11:08:09 +0300 Subject: [PATCH 2/2] ci: smoke test installed v0.2 comparison workflow --- .github/workflows/tests.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 054ab04..3e1e6ed 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -42,5 +42,35 @@ jobs: - name: Smoke test installed CLI run: rfqdiff --help + - name: Smoke test installed CLI comparison + shell: bash + run: | + tmpdir="$(mktemp -d)" + cd "$tmpdir" + printf 'name,currency,price,lead_time_weeks,payment_days\nSupplier A,EUR,100,4,30\nSupplier B,EUR,120,5,0\n' > quotations.csv + rfqdiff quotations.csv --json > result.json + rfqdiff quotations.csv --report comparison.xlsx > /dev/null + python - <<'PY' + import json + from pathlib import Path + from openpyxl import load_workbook + + payload = json.loads(Path("result.json").read_text(encoding="utf-8")) + assert payload["tool"] == "rfqdiff" + assert payload["version"] == "0.2" + assert payload["recommended_supplier"] == "Supplier A" + assert payload["decision_summary"]["runner_up"]["name"] == "Supplier B" + assert payload["suppliers"][0]["score_breakdown"]["price"] == 50.0 + assert payload["suppliers"][0]["rfqdiff_source"]["file"] == "quotations.csv" + + workbook = load_workbook("comparison.xlsx", read_only=True, data_only=True) + try: + assert workbook.sheetnames == ["Comparison", "Summary"] + assert workbook["Comparison"]["C2"].value == "Supplier A" + assert workbook["Summary"]["B2"].value == "Supplier A" + finally: + workbook.close() + PY + - name: Smoke test installed package run: python -c "import rfqdiff; assert rfqdiff.__version__ == '0.2.0'"