Skip to content

v1.0.0

Latest

Choose a tag to compare

@abelmilash-msft abelmilash-msft released this 29 May 02:37
· 1 commit to main since this release
8df1c96

Breaking Changes

  • Previously deprecated flat methods on DataverseClient (create, update, delete, get, list, query_sql, upload_file, etc.) are now removed; use the namespaced operations: client.records, client.query, client.tables, client.files, client.batch (#175)

  • client.query.sql_select(), client.query.sql_joins(), client.query.sql_join() are removed (#175)

  • QueryBuilder.execute() now returns a flat QueryResult instead of Iterable[Record]; use execute_pages() for lazy iteration (#175)

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

Added

  • Async clientAsyncDataverseClient with full feature parity to the sync SDK; all operation namespaces available with async with lifecycle management. Install with pip install PowerPlatform-Dataverse-Client[async] (#171)
  • Single-record fetchclient.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)
  • Multi-record fetchclient.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)
  • Streaming multi-record fetchclient.records.list_pages(...) yields one QueryResult per HTTP page; streaming counterpart to list() with the same parameter set (#175)
  • FetchXMLclient.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)
  • Streaming QueryBuilderQueryBuilder.execute_pages() lazily yields one QueryResult per HTTP page; replaces deprecated execute(by_page=True) (#175)
  • Composable filtersQueryBuilder.where(col("name") == "Contoso") with Python operators (==, >, &, |, ~); replaces the deprecated filter_eq(), filter_contains(), and other filter_* helpers (#175)
  • QueryResult indexingresult[0] returns a Record; result[1:5] returns a new QueryResult (#175)
  • DataverseModel protocol — structural Protocol in models/protocol.py for typed entity classes; enables CRUD operations without manual table names or dict serialization (#175)
  • Top-level re-exportscol(), raw(), QueryResult, and DataverseModel importable directly from the top-level PowerPlatform.Dataverse package (#175)
  • Shorter imports — public types (Record, DataverseError, QueryBuilder, BatchResult, and others) now importable directly from PowerPlatform.Dataverse.models, .core, and .operations (#165)
  • 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; 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)

Changed

  • 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)
  • 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)
  • Table creation now uses the CreateEntities API, improving performance (#183)
  • float/double column precision default raised from 2 to 5 decimal places, preventing silent truncation of values like 2.718 (#185)
  • Server inner error messages now surface in HttpError.message on both single-request and batch paths (#185)
  • pandas.DataFrame with MultiIndex columns now raises a descriptive error with a flatten hint instead of failing deep in serialization (#185)

Fixed

  • Client creation no longer errors on Python 3.10 and 3.11 (#188)
  • SQL guardrails now catch write statements hidden inside comments, string literals, or zero-width prefixes (#185)

Deprecated

  • QueryBuilder.execute(by_page=True) and execute(by_page=False) emit UserWarning; use execute_pages() and execute() respectively (#175)
  • 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)