v1.2.0 — DX bundle
DX-focused release. Seven new capabilities, no breaking changes from 1.1.x.
What's new
Introspection commands
google-sheets:list— every configured bindinggoogle-sheets:tabs <binding>— tabs in a bound spreadsheetgoogle-sheets:peek <binding> [sheet] [--rows --range]— preview rows as a tablegoogle-sheets:doctor— probe each binding, non-zero exit on failure (deploy-pipeline friendly)
Typed reads
`SheetsService::readEntities(MyDto::class)` denormalizes rows into typed DTOs via the Symfony Serializer. Use the new `#[SheetColumn('Header Name')]` attribute on DTO properties for friendly-name mapping.
Streaming
`SheetsService::readAssocIterable(int $batchSize = 500): \Generator` walks giant sheets in column-letter-paged batches — no full-sheet load.
Per-binding caching
Add `cache: {ttl: , pool: cache.app}` to a spreadsheet entry and reads memoise through Symfony cache contracts. Tracing wins over caching in dev so the profiler shows real Sheets calls.
Profiler enhancements
- Per-binding groups in the panel with sub-totals
- Caller-origin column links each call back to the file that triggered it
Test fake
`Gulaandrij\GoogleSheetsBundle\Test\InMemorySheetsService` — drop-in for SheetsService backed by an in-memory map. Skip Google entirely in functional tests.
Other
`SheetsRegistry` service exposes the bindings catalog programmatically. `SheetsService` is no longer final (subclasses are bundle internals).
Install / upgrade
```bash
composer require gulaandrij/google-sheets-bundle:^1.2
```
Full CHANGELOG.