Skip to content

Commit 26adac1

Browse files
author
Abel Milash
committed
Update changelog
1 parent 29eabb5 commit 26adac1

1 file changed

Lines changed: 14 additions & 11 deletions

File tree

CHANGELOG.md

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,30 @@ This is the first stable release. It establishes the v1 public API and removes a
1111

1212
### Breaking Changes
1313

14-
- All flat methods on `DataverseClient` (`create`, `update`, `delete`, `get`, `list`, `query_sql`, etc.) are removed; use the namespaced operations: `client.records`, `client.query`, `client.tables`, `client.files`, `client.batch` (#175)
15-
- `client.query.sql_select()`, `sql_joins()`, `sql_join()` are removed (#175)
14+
- All flat methods on `DataverseClient` (`create`, `update`, `delete`, `get`, `list`, `query_sql`, `upload_file`, etc.) are removed (~570 lines); use the namespaced operations: `client.records`, `client.query`, `client.tables`, `client.files`, `client.batch` (#175)
15+
- `client.query.sql_select()`, `client.query.sql_joins()`, `client.query.sql_join()` are removed (#175)
1616
- `QueryBuilder.execute()` now returns a flat `QueryResult` instead of `Iterable[Record]`; use `execute_pages()` for lazy iteration (#175)
1717

1818
Run `dataverse-migrate --dry-run .` to automatically rewrite v0 call sites (`pip install PowerPlatform-Dataverse-Client[migration]`).
1919

2020
### Added
2121

2222
- **Async client**`AsyncDataverseClient` with full feature parity to the sync SDK; all operation namespaces available as `async def` with `async with` lifecycle management. Install with `pip install PowerPlatform-Dataverse-Client[async]` (#171)
23-
- **FetchXML**`client.query.fetchxml(xml)` returns an inert `FetchXmlQuery` that executes lazily via `.execute()` or `.execute_pages()`; handles Dataverse paging, URL length limits, and a 10,000-page circuit breaker (#175)
24-
- **Streaming queries**`QueryBuilder.execute_pages()` and `client.records.list_pages()` yield one `QueryResult` per HTTP page for memory-efficient iteration over large result sets (#175)
25-
- **Multi-record fetch**`client.records.list()` returns an eager flat `QueryResult`; GA replacement for `records.get()` without a record ID. Supports `filter`, `select`, `orderby`, `expand`, `page_size`, `count`, and `include_annotations` (#175)
26-
- **Composable filters**`QueryBuilder.where(col("name") == "Contoso")` with Python operators (`&`, `|`, `~`); replaces the deprecated `filter_eq()`, `filter_contains()`, and other `filter_*` helpers (#175)
27-
- **Single-record fetch**`client.records.retrieve(table, id)` returns `None` on 404 instead of raising; accepts `select`, `expand`, and `include_annotations` (#175)
23+
- **Single-record fetch**`client.records.retrieve(table, record_id, *, select, expand, include_annotations)` returns `None` on 404 instead of raising; `expand` adds `$expand` for navigation-property expansion on the single-record GET; `include_annotations` maps to the `Prefer: odata.include-annotations` header for formatted values and lookup labels (#175)
24+
- **Multi-record fetch**`client.records.list(table, *, filter, select, top, orderby, expand, page_size, count, include_annotations)` returns an eager flat `QueryResult`; GA replacement for `records.get()` without a record ID; `page_size` controls `Prefer: odata.maxpagesize`, `count=True` adds `$count=true`, `include_annotations` requests formatted values (#175)
25+
- **Streaming multi-record fetch**`client.records.list_pages(...)` yields one `QueryResult` per HTTP page; streaming counterpart to `list()` with the same parameter set (#175)
26+
- **FetchXML**`client.query.fetchxml(xml)` returns an inert `FetchXmlQuery`; no HTTP call until `.execute()` or `.execute_pages()`. Paging implements the documented Dataverse algorithm: annotation parsed as outer XML, `pagingcookie` attribute double URL-decoded, server-supplied `pagenumber` used for the next page, `morerecords` handled as both `bool` and `"true"` string, `UserWarning` emitted on simple-paging fallback, 32,768-character URL limit enforced (documented Dataverse GET cap), 10,000-page circuit breaker against runaway iteration (#175)
27+
- **Streaming QueryBuilder**`QueryBuilder.execute_pages()` lazily yields one `QueryResult` per HTTP page; replaces deprecated `execute(by_page=True)` (#175)
28+
- **Composable filters**`QueryBuilder.where(col("name") == "Contoso")` with Python operators (`==`, `>`, `&`, `|`, `~`); replaces the deprecated `filter_eq()`, `filter_contains()`, and other `filter_*` helpers (#175)
2829
- **`QueryResult` indexing**`result[0]` returns a `Record`; `result[1:5]` returns a new `QueryResult` (#175)
29-
- **`DataverseModel` protocol** — structural `Protocol` for typed entity classes; enables CRUD operations without manual table names or dict serialization (#175)
30-
- **Migration tool**`dataverse-migrate` console script rewrites v0 call sites to the v1 API with `--dry-run` support; marks files requiring manual attention with `[NEEDS-MANUAL]`. Requires `pip install PowerPlatform-Dataverse-Client[migration]` (#175)
30+
- **`DataverseModel` protocol** — structural `Protocol` in `models/protocol.py` for typed entity classes; enables CRUD operations without manual table names or dict serialization (#175)
31+
- **Top-level re-exports**`col()`, `raw()`, `QueryResult`, and `DataverseModel` importable directly from the top-level `PowerPlatform.Dataverse` package (#175)
3132
- **Shorter imports** — public types (`Record`, `DataverseError`, `QueryBuilder`, `BatchResult`, and others) now importable directly from `PowerPlatform.Dataverse.models`, `.core`, and `.operations` (#165)
33+
- **Migration tool** — installed as the `dataverse-migrate` console script (also runnable via `python -m PowerPlatform.Dataverse.migration.migrate_v0_to_v1`); rewrites v0 call sites to the v1 API with `--dry-run` support; covers `create`, `update`, `delete`, `get`, `list`, `fetchxml`, and query-builder patterns; auto-rewrites `QueryBuilder.to_dataframe()``.execute().to_dataframe()`; emits a `[NEEDS-MANUAL]` label for files with no auto-rewrites but manual attention needed, and appends a trailing note on `[MIGRATED]` lines when manual items remain. Requires the `[migration]` optional extra (`pip install PowerPlatform-Dataverse-Client[migration]`) (#175)
3234

3335
### Changed
3436

37+
- `records.get()` deprecation extended: calling with a `record_id` emits `DeprecationWarning` directing callers to `retrieve()`; calling without a `record_id` directs callers to `list()` (#175)
3538
- `OperationContext` now validates keys and values against an allowlist; unknown keys or non-conforming values raise `ValidationError`, preventing PII from reaching the `User-Agent` header (#181)
3639
- Table creation now uses the `CreateEntities` API, improving reliability (#183)
3740
- `float`/`double` column precision default raised from 2 to 5 decimal places, preventing silent truncation of values like `2.718` (#185)
@@ -46,8 +49,8 @@ This is the first stable release. It establishes the v1 public API and removes a
4649

4750
### Deprecated
4851

49-
- `QueryBuilder.execute(by_page=True/False)` use `execute_pages()` and `execute()` respectively (#175)
50-
- `client.query.odata_select()`, `odata_expands()`, `odata_expand()`, `odata_bind()` — use `QueryBuilder.expand()` instead (#175)
52+
- `QueryBuilder.execute(by_page=True)` and `execute(by_page=False)` emit `UserWarning`; use `execute_pages()` and `execute()` respectively (#175)
53+
- `client.query.odata_select()`, `client.query.odata_expands()`, `client.query.odata_expand()`, `client.query.odata_bind()` emit `DeprecationWarning`; navigation-property helpers are replaced by `QueryBuilder.expand()` (#175)
5154

5255
## [0.1.0b10] - 2026-05-12
5356

0 commit comments

Comments
 (0)