Skip to content

Commit 11f9dc3

Browse files
elainethaleclaude
andcommitted
release: prep v2.1.0 (version bump, CHANGES, ROADMAP)
- __version__ 2.0.0 -> 2.1.0 (single source; pyproject reads it dynamically) - CHANGES.txt: v2.1.0 entry (gams.transfer opt-in read/write backend, backend= / GDXPDS_BACKEND / --backend, to_dataframes(symbols=), Backend / BackendError / SymbolNotFoundError, HAVE_GAMS_TRANSFER) - ROADMAP: mark v2.1.0 Phase B done and the release prep complete Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e0f7de4 commit 11f9dc3

3 files changed

Lines changed: 22 additions & 8 deletions

File tree

CHANGES.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
v2.1.0, 05/23/26 -- gams.transfer I/O engine for reading and writing GDX, opt-in
2+
and non-breaking; select it with the backend= keyword, the GDXPDS_BACKEND
3+
environment variable, or the --backend CLI flag. gdxcc stays the default,
4+
and the two engines produce identical DataFrames and GDX files
5+
gams.transfer is much faster on large files (order-of-magnitude on
6+
hundreds-of-MB GDX) but slower on very small ones; it is usable only with
7+
a compatible gamsapi installed (check gdxpds.HAVE_GAMS_TRANSFER)
8+
gdxpds info reports the resolved backend and gams.transfer usability
9+
to_dataframes() gains a symbols= argument to read only the named symbols
10+
new SymbolNotFoundError, raised for an unknown symbol name (subclass of
11+
gdxpds.tools.Error, like BackendError)
112
v2.0.0, 05/20/26 -- BREAKING: to_dataframe() now always returns a plain DataFrame;
213
the old_interface argument is removed. Migrate by dropping any
314
old_interface=False from calls (old_interface=True previously

dev/ROADMAP.md

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ Each PR branches off `main`, in order:
4242
| `eh/ruff-typing-tooling` | **v1.6.0** | typing + tooling; finish with the `to_dataframe` deprecation warning, version bump, CHANGES entry |
4343
| e.g. `eh/breaking-cleanup` | **v2.0.0** | remove `.py` CLI shims, gdx2py, and `to_dataframe(old_interface=...)` |
4444
| `eh/test-gaps` | _(no tag)_ | test-gap groundwork; the correctness oracle for the speedup — **landed** (PR #109) |
45-
| `eh/gams-transfer` | **v2.1.0** | Phase 0 (gdxcc extracted) + Step 1 (backend switch) + Phase A (read fast path) **done**; Phase B (write) remaining |
46-
| e.g. `eh/gams-transfer-default` | **v3.0.0** | flip default to gams.transfer + add set-text-write (breaking, coordinated) |
45+
| `eh/gams-transfer` | **v2.1.0** | Phase 0 (gdxcc extracted) + Step 1 (backend switch) + Phase A (read) + Phase B (write) **done**; version bumped + CHANGES written — ready to merge and tag |
46+
| e.g. `eh/gams-transfer-default` | **v3.0.0** | flip default to gams.transfer + add set-text-write (breaking, coordinated) + full status for Alias |
4747

4848
Ordering: the test-gap PR lands before the speedup PR — those tests are the
4949
correctness oracle for the backend swap. The breaking-cleanup PR is independent
@@ -122,13 +122,14 @@ back): read 776.6 s → 9.0 s (~86x), write 1002.0 s → 11.5 s (~87x). The "pro
122122
only if the speedup is material" gate is decisively met — which is why this release
123123
now also covers writes, not just reads.
124124

125-
**Status (branch `eh/gams-transfer`, landed locally in order).** Phase 0 (gdxcc
125+
**Status (branch `eh/gams-transfer`, complete).** Phase 0 (gdxcc
126126
extracted behind a `GdxBackend` ABC; set-text reads unified), Step 1 (`Backend`
127127
enum + `backend=` kwarg + `GDXPDS_BACKEND` env var + `HAVE_GAMS_TRANSFER` +
128-
`to_dataframes(symbols=...)` subset + `BackendError`/`SymbolNotFoundError`), and
128+
`to_dataframes(symbols=...)` subset + `BackendError`/`SymbolNotFoundError`),
129129
**Phase A** (the gams.transfer read backend, parity-tested vs gdxcc over all
130-
fixtures incl. set text, special values, subset, and aliases). Two read-side
131-
decisions firmed up during Phase A:
130+
fixtures incl. set text, special values, subset, and aliases), and **Phase B**
131+
(the gams.transfer write backend, parity-tested over the full write × read
132+
backend matrix). Two read-side decisions firmed up during Phase A:
132133

133134
- *Aliases read as Sets* (both backends). Legacy gdxpds read an alias as a
134135
degenerate float column — an untested/unused path; it now reads like the set it
@@ -139,7 +140,9 @@ decisions firmed up during Phase A:
139140
libraries) reads as unavailable and transfer-gated tests skip cleanly rather
140141
than crashing. `info()` reports `gams.transfer usable: yes/no`.
141142

142-
**Remaining:** Phase B (the write path) + the v2.1.0 version bump / CHANGES entry.
143+
**Done:** all phases, plus the v2.1.0 version bump (`__version__` = 2.1.0) and the
144+
CHANGES.txt entry (05/23/26). Ready to merge to `main` and publish the `v2.1.0`
145+
Release; the local GAMS-matrix test run is the remaining gate.
143146

144147
**Why this is riskier than gdx2py was.** gdx2py was a clean drop-in (returned a
145148
plain list). gams.transfer is not:

src/gdxpds/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "2.0.0"
1+
__version__ = "2.1.0"
22

33
from gdxpds._backend import Backend, BackendError
44
from gdxpds.gdx import GdxError, SymbolNotFoundError

0 commit comments

Comments
 (0)