Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
30 changes: 30 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'"
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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.
Loading