Changelog¶
All notable changes to gcamreader are documented here. The format is based on
Keep a Changelog, and the project adheres
to Semantic Versioning.
This page is the canonical, rendered changelog. Each released version also records
its release verification — the behavioral regression results proving that the
release reproduces the previous version’s query outputs exactly. New releases
should add their own Release verification block following the pattern shown for
1.5.0 — 2026-06-15 below.
Unreleased¶
No unreleased changes yet.
1.5.0 — 2026-06-15¶
This release modernizes the package without changing its computational results.
A behavioral baseline captured from v1.4.0 is preserved in benchmarks/ and is
used as a regression gate to guarantee identical query outputs.
Added¶
Behavioral baseline harness and regression test suite in
benchmarks/that lock query, scenario,importdata, and CLI outputs to the v1.4.0 results.pyproject.tomlas the single source of build metadata and configuration.CHANGELOG.mdto track project changes.
Changed¶
Migrated packaging from
setup.pyandsetup.cfgtopyproject.toml(setuptools backend).Raised the minimum supported Python version to 3.11.
Replaced the Click based command line interface (and the
click-default-group-wheeldependency) with a Typer based CLI.Relaxed the pinned
requests~=2.20.0requirement to a modern minimum and refreshed thepandasandlxmlminimum versions.Modernized
querymi.py: removed Python 2 and Python 3.5 compatibility branches, replacedpkg_resourceswithimportlib.resources, and added type hints and complete docstrings.Moved the test suite to a top level
tests/directory and the example notebooks to a top levelnotebooks/directory.
Fixed¶
Result parsing in
_parsersltnow aggregates withdropna=False, so rows that contain missing values in one or more grouping columns are retained instead of being silently dropped during thegroupby().sum()step (PR #40).
Removed¶
setup.py,setup.cfg,requirements.txt, andMANIFEST.in(superseded bypyproject.toml).
Release verification¶
Result: PASS — v1.5.0 reproduces the v1.4.0 outputs exactly.
Because v1.5.0 is a modernization release, its central guarantee is that it
changes no computational results. To prove this, a behavioral baseline was
captured from v1.4.0 and committed under benchmarks/baseline/; the
v1.5.0 code is then re-run through the same operations and its outputs are
compared against that baseline by benchmarks/test_regression.py.
Every fixture matches the v1.4.0 baseline. CSV outputs are compared
byte-for-byte by SHA-256 checksum, and DataFrame outputs are compared with
pandas.testing.assert_frame_equal() after a deterministic sort.
Operation |
Result |
Comparison method |
Java |
|---|---|---|---|
|
identical |
exact title/region/query strings |
not req. |
|
identical |
|
required |
|
identical |
|
required |
|
identical |
|
required |
|
identical |
SHA-256 (byte-for-byte) |
required |
The committed v1.4.0 baseline fixtures and their SHA-256 checksums
(from benchmarks/baseline/manifest.json) are:
Fixture |
SHA-256 |
|---|---|
|
|
|
|
|
|
|
|
|
|
Baseline capture environment:
Component |
Value |
|---|---|
Baseline version |
|
Python |
|
Java |
OpenJDK |
Platform |
macOS 26.5.1 (arm64) |
Benchmark query |
Crop Land Allocation (bundled land query) |
Reproduce the parity check locally with:
pytest benchmarks/test_regression.py
The structural parse_batch_query check runs without Java; the
database-backed checks require a Java runtime and the bundled sample database.
See Verified GCAM Versions for the separate study confirming compatibility
across GCAM database versions 5.3 through 9.1.