Add async support for Dataverse SDK#171
Open
abelmilash-msft wants to merge 28 commits into
Open
Conversation
e491241 to
b848324
Compare
b32987a to
ad9297e
Compare
f52d6b8 to
8ff97e4
Compare
8ff97e4 to
a23cecd
Compare
a23cecd to
4a319bf
Compare
4a319bf to
68e705a
Compare
500c19f to
55e3359
Compare
a374227 to
602c990
Compare
- Reset to main (which is now PR #175) - Re-apply: _ODataBase, _BatchBase, _QueryBuilderBase, _BatchContext Protocol, _operation_context in base, Self type annotation - Re-export multipart helpers from _batch.py for test compatibility - Update test_sql_parse.py patch target to _odata_base.urlparse Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Reset to main via refactoring branch - Restore full async implementation: aio/ client, HTTP, batch, OData, relationships, upload, query builder, fetchxml, operations, tests, examples - Re-export multipart helpers from _batch.py for test compatibility - All 2166 tests passing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
602c990 to
a4f69cd
Compare
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Rename `r` to `response` for consistency with _async_http.py. Replace multi-pass comprehension + zip in _resolve_table_remove_columns with a plain for loop matching the sync _batch.py structure. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace broad try/except around r.json() with hasattr guard, matching the sync FetchXmlQuery pattern. Remove the now-obsolete test that verified the exception-swallowing behavior. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Moves fetchxml() after sql_columns() to match the order in the sync QueryOperations: builder, sql, fetchxml, sql_columns, odata_*. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Order now matches sync exactly: builder, sql, fetchxml, sql_columns, odata_expands. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add missing "Use for SQL-JOIN scenarios..." sentence, expand :return: description, add link-entity JOIN example, align Eager/Lazy comment wording, and add the two inline implementation comments from sync. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ession on auth failure - functional_testing.py: replace batch.records.get() with batch.records.retrieve(); close client session on auth failure to avoid unclosed session warning - sql_examples.py: remove odata_select/odata_expand/odata_bind calls (deprecated sync-only helpers not available on async client); keep only odata_expands() Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ontent _AsyncResponse buffers the body in ._body; it has no .content attribute (unlike requests.Response used by the sync client). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…replace downloads Two download paths after replace uploads still used resp_r.content and resp_rc.content instead of ._body, causing AttributeError. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Validates 7 properties of the async client against a live environment: 1. Non-blocking reads — canary confirms event loop stays free during GETs 2. Read throughput — concurrent reads via gather() beat sequential 3. Write concurrency — concurrent POSTs beat sequential (POST path) 4. Pagination non-blocking — async generators yield between page fetches 5. Mixed fan-out — different op types run simultaneously without serialization 6. Error resilience — one failure in gather() does not kill other calls 7. Real-world fan-out — metadata for multiple tables fetched in parallel Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each test now has a brief explanation of what it runs, what property it validates, and what a failure would indicate. Also clarifies that speedup measures async-sequential vs async-concurrent, not async vs sync. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
aio/async package mirroring the sync SDK:_AsyncHttpClientwrappingaiohttpwith identical retry, backoff, and timeout logic_AsyncAuthManagerfor async Azure Identity token acquisition_AsyncODataClient— full CRUD, SQL-over-API, table/column metadata, file upload, and relationship operations_AsyncBatchClientwith_SyncResponseWrapperbridging the async HTTP response to the shared sync multipart parser in_BatchBaserecords,tables,query,files,batch,dataframe— all mirroring their sync counterpartsAsyncDataverseClientwith lazy init, async context manager, and session lifecycle managementpytest-asyncio(asyncio_mode = auto) andaiohttpas an optional dependency (pip install PowerPlatform-Dataverse-Client[async]).Test plan
black --checkpasses on all files