Releases: Reddimus/ncei-cpp
Release list
v0.3.1
Fixed
-
NCEI CAG response format flip. Upstream NCEI Climate at a Glance
data.json(/access/monitoring/climate-at-a-glance/global/...) now
wraps each year's value in an object envelope:old: "1851": "-0.12" (bare string) new: "1851": {"departure": -0.12} (nested-object form)deserialize_cag_seriespreviously matched only the bare string /
numeric forms, so every row dropped silently and the parser raised
CAG: empty data series. As a result the polymarket-data
climate-indexingester (#79) couldn't populate thencei_cag
series — gistemp + nsidc continued to work; the CAG cross-check did
not. Detected 2026-05-19 via the climate-index startup log.The deserializer now tolerates BOTH forms: the legacy bare
string/number stays accepted (so a future NCEI flip back doesn't
re-break us), and the new{"departure": <num|str>}envelope is
unwrapped. Any other inner keys (e.g. a future"rank"/
"uncertainty") are ignored. Tests in
tests/test_climate_index.cpp::ParsesCagDepartureObjectForm/
ParsesCagDepartureStringInsideObject/
RejectsCagObjectWithoutDeparturepin all three regimes.
v0.3.0
Added
- National-climate settlement feeds.
ncei/models/climate_index.hpp
withdeserialize_cag_series(NCEI Climate at a Glance / NOAAGlobalTemp
data.json— "hottest year rank"),deserialize_gistemp_csv(NASA
GISTEMPGLB.Ts+dSST.csvcross-check), and
deserialize_nsidc_sea_ice_csv(NSIDC Sea Ice Index v4 — "minimum
Arctic sea-ice extent"). NewMonitoringClient
(get_cag_global_annual/get_gistemp_global/
get_nsidc_arctic_extent).HttpClientnow passes absolute URLs
through unchanged so one client reaches all three hosts (ncei.noaa.gov,
data.giss.nasa.gov, noaadata.apps.nsidc.org); relative CDO / Data
Service paths are unaffected. Consumed by polymarket-data (Phase 3c). .editorconfig(fleet-standard: tabs, 4-width, LF, UTF-8, 100-col
max for C++). Sibling to.clang-format; covers editors that don't
read.clang-format(#12).make pre-commit+make install-hookstargets — auto-format + lint
via git pre-commit hook (#8).
Changed
Fixed
- LICENSE: copyright holder de-truncated (#11).
v0.2.0
Changed
- BREAKING: JSON parsing migrated from
nlohmann/jsonv3.11.3 to
Glazev7.6.0. The public
client API (CDOClient::get_*,DataServiceClient::get_*,
parse_csv_data/parse_ssv_data) is unchanged. Internal
from_json(const nlohmann::json&, T&)overloads have been replaced
withdeserialize_<T>(std::string_view, T&) -> Result<void>in the
ncei::namespace. The transitionaljson_string/json_int/
json_double/json_boolhelpers inmodels/common.hppare gone
(no external consumers). Benchmark: ~9-15x parse speedup on a
representative 21 KB CDO/stationslist-response payload
(nlohmann ~360-590 us/op → Glaze ~32-40 us/op on x86_64-v3,
GCC 13.3, -O3 -DNDEBUG). - C++23 baseline reaffirmed — Glaze requires C++23 for its
compile-time reflection path.CMakeLists.txtalready enforced this.
Added
tests/glaze_test.cpp— verifies parse-output shape parity with the
pre-migration behavior (null-safety on every scalar field,
unknown-key tolerance, dynamic DataPoint attribute preservation,
CDO list-response envelope walking, snake_case ↔ camelCase
JSON-key aliasing fordatacoverage/mindate/maxdate/
elevationUnit).tests/parse_benchmark.cpp— parse-throughput regression guard. Caps
at 200 us/op (≈3x slower than the migration-time Glaze number) with
a 30s ctest timeout.
Removed
src/core/pagination.cpp(the nlohmannfrom_jsonoverload for
ResultSetMetadata). The CDO envelope is now parsed by a templated
Glaze meta specialization insrc/models/pagination_detail.hpp(an
internal-only header).
v0.1.1
CI
- First-ever GitHub Actions workflow coverage — build + test + lint on
Ubuntu 24.04, build-only on macos-latest, markdown-lint via
DavidAnson/markdownlint-cli2-action
(3031c1e). build-windowsjob added via vcpkg (parity with the rest of the SDK
family).release.ymlauto-creates a GitHub Release onvX.Y.Ztag push,
with body sourced from this CHANGELOG via--notes-fileso inline
codespans survive
(6831030,
91f53ca).- Tag/CMakeLists
VERSIONdrift is caught at release time
(67fa6de). actions/checkout@v6upgrade for Node 24 runtime
(71f41f1)..markdownlint-cli2.yamlconfig disablesMD013(line-length) and
other style-noise rules; sibling repos share the same shape.MD004(asterisk style) disabled for prose continuation parity
(79abd8c).CLAUDE.mdmarkdown reflowed to satisfy the new lint job
(c4add51).cpp_auto_audit.pynow walks--cached + --othersso new test
files don't pass local lint and fail CI
(d681291).
Docs
- Add a Contributing section to the README
(c2c15a1). - Add CI / release / C++ standard / license badges to the top of the
README (aad8888). - Squash double-blank-line inserted by the Contributing section
(898c594). - Add this
CHANGELOG.md+ the auto-release-on-tag workflow it feeds
(6831030).
Build
- Enforce explicit local cpp types (
72ab089).
Chore
- Production-hardening
.gitignorepatterns mirrored from the rest of
the SDK family
(bca2e70).
Refactor
- Replace
std::ostringstreamwithstd::format/std::format_to
throughout (91de476).
v0.1.0 - Initial Release
Added
- Initial release: C++23 NCEI Climate Data SDK
- Dual-client design:
CDOClient— token auth, 5 req/sec + 10K/day rate limit, offset
pagination, 1-year date-range limit (auto-split viaget_data_all)DataServiceClient— no auth, multi-format (CSV / JSON / SSV),
+URL-encoding for timezones
- Layered static libraries:
ncei_core→ncei_http→ncei_models
→ncei_cdo+ncei_data→ncei(INTERFACE) std::expected<T, Error>for all returns;ErrorCode::QuotaExceeded
for CDO daily-quota exhaustion- Auto-pagination + auto-date-splitting (transparent multi-year queries)
- Optional NetCDF support via
NCEI_ENABLE_NETCDFbuild flag - Endpoints: CDO (datasets, data_categories, data_types,
location_categories, locations, stations, data) + Data Service
(data, metadata)