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'" 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.