- bls_client/retry.py: with_retries() retries timeouts/connection drops and
429/5xx with exponential backoff; honors Retry-After; never retries 4xx or
BLSQuotaError (those won't fix themselves)
- BLSClient(retries=2, backoff=0.5) wraps the data POST and discovery GETs;
qcew CSV fetch wrapped too. retries=0 disables.
- tests/test_retry.py: 6 offline tests (injectable sleep, no real delays)
- README: retry behavior documented; drop the now-resolved limitation
Offline suite 125 passing; live smoke green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- pyproject.toml: setuptools build, deps (requests), dev extra (pytest),
pytest config with opt-in `live` marker
- tests/: 95 offline tests locking every series-ID encoding against
known-good IDs (regression guard for the JOLTS/OES/ECI/productivity/QCEW
fixes), plus a live API smoke test behind `-m live`
- README: install-as-package + test instructions; drop the now-resolved
"no packaging"/"no tests" limitations
- gitignore build/test artifacts
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>